【问题标题】:PHP Persist variable across all requestsPHP 在所有请求中保持变量
【发布时间】:2015-01-15 00:52:30
【问题描述】:

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

为了帮助解释这里是一个例子: 我想要一个这样的脚本,它会计数。无论哪个用户/浏览器打开该 url。

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

我希望将值存储在内存中。当 apache 重新启动并且数据并不那么重要以至于它需要是线程安全的时,它就不需要持久化了。

更新:如果它在负载平衡环境中为每台服务器保存不同的值,我很好。 C# 或 Java 中的静态变量也不会同步。

【问题讨论】:

标签: php lamp


【解决方案1】:

您通常会使用数据库来存储计数。

但是,您也可以使用文件来执行此操作:

<?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);

【讨论】:

  • 如果您要使用文件,也可以使用 sqlite。
  • @Mike coulda shoulda willa
【解决方案2】:

在 php 中,您将不得不使用所有服务器共享的外部存储。最常用的工具是 memcached,但 sql 和 redis 都适用于这个用例。

【讨论】:

    【解决方案3】:

    这样做的唯一方法是,就像 bspates 所说,一个不依赖于服务器上任何资源的工具。如果你有不同的服务器,你就不能依赖每台机器上基于内存的机制。 您必须将此数字存储在服​​务器之外,因为每个服务器都将存储它自己的文件或内存的值。

    如果您只有一台服务器来接收您的请求,文件写入(如 $_SESSION)将起作用。对于多个服务器,您需要任何类型的数据库,所有服务器都可以与之通信。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 2010-10-05
      • 2019-07-26
      • 2021-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多