跨会话的静态变量

13

在ASP.NET中,如果我将变量(或对象)声明为静态的(或者我将其设为单例),那么我可以在多个用户的多个会话中使它持久化存在(它被注册在服务器范围内),这样我就不必在每次请求时都进行初始化。

PHP中是否有类似的功能呢?谢谢。


这是 Redis 的一个使用案例吗? - pbarney
7个回答

7

链接已损坏。 - AaronJ

4
您可以使用PHP扩展(用C语言编写)来实现这一功能。
但如果您想用PHP编写,不行。最好的替代方案是在每个请求结束时将变量写入文件(file_put_contents()),并在每个请求开始时打开它(file_get_contents())。
这种替代方案对于高访问量的站点来说不适用,因为进程会同时进行读写操作,会导致严重的问题。

1
“BLAAA-WOOO-EEE-WOHHH-BOOOM”? 这不太好,对吧? - ashleedawg

4
这在PHP中是不存在的,但是你可以将数据进行序列化并将其放在硬盘上的文件或/dev/shm/中。你也可以使用memcache。
如果你将数据放在/dev/shm/中或使用memcache,则数据在重启后会消失。

0

如果您为所有会话使用相同的sessionId,则可以使用Session Storage来实现此目的。

session_id('xyz');
session_start();
for ($i=0; $i < 100000; $i++) {
    $_SESSION['counter'] = isset($_SESSION['counter']) ? $_SESSION['counter'] + 1 : 0;
}
echo "<br>session_id(): ".session_id() . "<br>counter: ".$_SESSION["counter"];

使用两个浏览器尝试此脚本,您将看到此方法在两个浏览器之间共享数据,并且非常快速。


0

很遗憾,PHP的static关键字仅限于当前脚本实例。

要在同一会话的脚本实例之间保留数据,您可以使用会话处理功能。

要在不同会话之间保留数据,您需要使用类似memcache的东西,但这需要在服务器端进行额外的设置工作。


0

Symfony和其他框架使用"PHPFastCache",它支持多种缓存数据的驱动程序,包括APC、SQLite、MongoDB或者简单地使用文件系统。

您可以在https://github.com/PHPSocialNetwork/phpfastcache下载它。

这里是一个使用文件缓存的示例:

use Phpfastcache\Helper\Psr16Adapter;

$defaultDriver = 'Files';
$Psr16Adapter = new Psr16Adapter($defaultDriver);

// Setter action
if(!$Psr16Adapter->has('test-key')) {
    $data = 'lorem ipsum';
    $Psr16Adapter->set('test-key', 'lorem ipsum', 300); // kept in cache for 300 seconds (5 minutes)
}

// Getter action
else {
    $data = $Psr16Adapter->get('test-key');
}

-1

您可以在会话中存储序列化副本

class test{
  private static $instance;
  public property;
  private __construct(){}
  public getInstace(){
    if(!self::$instance){
      self::$instance = new test;
    }
    return self::$instance;
  }
}

$p = test->getInstance();
$p->property = "Howdy";
$_SESSION["p"] = $p;

下一页

$p = $_SESSION["p"];
echo $p->property; // "Howdy"

2
在我看来,这种方式只能在同一会话的页面之间共享变量,对于多个会话或多个用户之间的共享并不有用。 - T30
这是一个旧的答案,现在我建议编写一个模块,有许多选项可以轻松编写编译后的共享模块,例如C或C++。 - markcial

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接