PHP在所有请求中保持变量

jobtbby3  于 2023-03-11  发布在  PHP
关注(0)|答案(4)|浏览(126)

在一些语言C#或.NET中,这是一个静态变量,但在PHP中,每次请求后都会清空内存。我希望该值在所有请求中保持不变。我不想使用$_SESSION,因为每个用户的情况都不一样。

**为了帮助解释这里是一个例子:**我想有一个这样的脚本,将计数。无论哪个用户/浏览器打开的网址。

<?php
function getServerVar($name){
    ...
}
function setServerVar($name,$val){
    ...
}
$count = getServerVar("count");
$count++;
setServerVar("count", $count);
echo $count;

我希望值存储在内存中。它不会是apache重新启动时需要持久化的东西,数据也不是那么重要,需要线程安全。

UPDATE:如果在负载平衡的环境中,每个服务器的值不同,我很好。C#或Java中的静态变量也不会同步。

u7up0aaq

u7up0aaq1#

通常使用数据库来存储计数。
但是,作为一种替代方法,您可以使用文件来执行此操作:

<?php
$file = 'count.txt';
if (!file_exists($file)) {
    touch($file);
}

//Open the File Stream
$handle = fopen($file, "r+");

//Lock File, error if unable to lock
if(flock($handle, LOCK_EX)) {
    $size = filesize($file);
    $count = $size === 0 ? 0 : fread($handle, $size); //Get Current Hit Count
    $count = $count + 1; //Increment Hit Count by 1
    echo $count;
    ftruncate($handle, 0); //Truncate the file to 0
    rewind($handle); //Set write pointer to beginning of file
    fwrite($handle, $count); //Write the new Hit Count
    flock($handle, LOCK_UN); //Unlock File
} else {
    echo "Could not Lock File!";
}

//Close Stream
fclose($handle);
bnlyeluc

bnlyeluc2#

正如bspates所说,唯一的方法是一个不依赖于服务器上任何资源的工具,如果你有多台服务器,你不能依赖每台机器上基于内存的机制,你必须在服务器之外存储这个数字,因为每台服务器将存储它自己的文件或内存的值。
如果你只有一个服务器来接收你的请求,像$_SESSION这样的文件写入就可以工作。如果有多个服务器,你需要任何类型的数据库,所有的服务器都可以与之通信。

ff29svar

ff29svar3#

在php中你必须使用一个所有服务器共享的外部存储,最常用的工具是memcached,但是sql和redis都能很好地满足这个需求。

vsaztqbk

vsaztqbk4#

最简单的方法之一是更改SESSION的行为,尽管您不能再进行常规会话。
你所要做的就是在session_start()之前添加下面的代码,这段代码使得session_id对于所有的请求都是一样的,因此假设所有的请求都在一个会话中(即使你从浏览器的存储标签中更改它,服务器仍然会发送下面的代码):

session_id('fq8aapoka3331'); // Or any other random and fixed phrase

重要提示:您必须做一些工作才能增加会话持续时间,例如将lifetime更改为session_set_cookie_params,将session.save_path(在共享主机中)和session.gc_maxlifetime更改为ini_set

相关问题