问题 跨会话的静态变量


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

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


6986
2018-03-18 17:53


起源

这是Redis的用例吗? - pbarney


答案:


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

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


6
2018-03-18 18:06





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

如果将数据放在/ dev / shm /中或使用memcache数据 会消失 重启。


4
2018-03-18 18:06





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

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

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


3
2018-03-18 17:57



+1表示您对世界末日的准确描述。 :P - DrFriedParts


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

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

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


0
2018-03-18 17:58





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

班级考试{
  private static $ instance;
  公共财产;
  private __construct(){}
  public getInstace(){
    如果(!自:: $实例){
      self :: $ instance = new test;
    }
    return self :: $ instance;
  }
}

$ p = test-> getInstance();
$ p-> property =“你好”;
$ _SESSION [“p”] = $ p;

下一页

$ p = $ _SESSION [“p”];
echo $ p-> property; // “你好”

0
2018-03-18 18:01



IMO仅在同一会话的页面之间共享变量:它对多个会话或多个用户之间的共享没有帮助。 - T30
这是一个古老的答案,现在我建议编写一个模块,有很多选项,如C或C ++,可以轻松编写编译的共享模块。 - markcial