跨会话的静态变量

时间:2010-03-18 17:53:38

标签: php session

在ASP.NET中,如果我声明一个变量(或对象)静态(或者如果我创建一个单例),我可以让它在多个用户的多个会话中保持不变(它在服务器中注册范围)所以我不必在每次请求时初始化它。

PHP中有这样的功能吗?感谢

6 个答案:

答案 0 :(得分:6)

您可以设置APC并使用apc_store和apc_fetch函数。

http://us.php.net/manual/en/book.apc.php

答案 1 :(得分:4)

在PHP中不存在,但是,您可以序列化数据并将其放在硬盘驱动器上的文件中或/ dev / shm /中。您也可以使用memcache。

如果您将数据放入/ dev / shm /或使用内存缓存,数据将在重新启动时消失

答案 2 :(得分:3)

您可以使用PHP扩展(用C语言编写)来实现。

但是如果你想用PHP编写它,没有。最好的替代方法是在每个请求结束时将变量写入文件(file_put_contents()),并在每个请求开始时打开它(file_get_contents())。

这种替代方案不适用于高容量网站,因为这些流程将同时进行读/写操作,并且全世界将全部使用BLAAA-WOOO-EEE-WOHHH-BOOOM。

答案 3 :(得分:0)

可悲的是,没有。 PHP的static关键字仅限于当前的脚本实例。

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

要在会话中保留数据,您必须使用类似memcache的内容,但这需要在服务器端进行额外的设置工作。

答案 4 :(得分:0)

您可以在会话

中存储对象的序列化副本
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"

答案 5 :(得分: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');
}