【问题标题】:Store PHP superglobal variable until Apache server restarts存储 PHP 超全局变量,直到 Apache 服务器重新启动
【发布时间】:2015-09-30 22:06:15
【问题描述】:

有没有办法使用 Apache 2 和 PHP 将变量存储在服务器 RAM 中,直到服务器关闭?我需要存储一个非常大的数组(hashmap),它应该被初始化一次(而不是用户一次,例如仅在服务器启动时)并从不同的文件访问。

$GLOBALS 没有全局技巧(我无法访问来自不同文件的$GLOBALS 变量,我做错了吗?); $_SESSION 做到了,但这不是我需要的。我需要将它存储在服务器即时访问内存中,只有在服务器重新启动时才会丢失。

显然,答案不是“数据库”,因为查询数据库比从 RAM 访问数组要慢。

在 Java 服务器上可以轻松完成,为什么不能在 Apache 上完成?

【问题讨论】:

  • global !== persistent.... ,甚至 Apache 共享内存
  • 只为当前请求存储一个全局变量,而不是在机器上的请求之间存储。我相信 Java servlet 默认具有服务器级存储,但 PHP 没有。然而,很容易在 PHP 中添加一个特性来做到这一点。
  • 它不需要持久化:事实上,数据库/文件系统是我从中获取原始数据的地方。想象一个大字典:我读了一次文件并构建了数组。我不能每次都读取文件(或查询数据库),只要服务器存在,我只需要保留数组。即使反序列化一个 1GB 的数组也太慢了,这就是 memcache 所做的(参见stackoverflow.com/questions/1190662/…)。我不需要对象生存到服务器死亡。我正在寻找类似存储在 $_SERVER 数组中的东西,看起来不应该这样做
  • 谢谢你。可以在不序列化/反序列化对象的情况下完成吗?像每个用户都有相同 ID 的永久 $_SESSION 之类的东西?我一直将 $_SESSION 视为存储用户信息的地方,而不是全局信息。
  • 貌似不行:bytes.com/topic/php/answers/6503-keeping-array-memory 关键字是“应用程序级变量”,php中没有这种东西。看来我要换语言了。

标签: php apache apache2 global-variables


【解决方案1】:

我找到了一个使用 apc_store (http://php.net/manual/en/function.apc-store.php) 且生存时间 = 0 的不错的解决方法。这不是我所需要的(我认为它仍然使用序列化),但它非常接近。比内存缓存好很多。

【讨论】:

  • 如果您通过php-fpm 提供 php,那么您就不会遇到上述问题,因为 Web 服务器和 php 应用程序服务器将断开连接,因此重新启动一个不会影响另一个。
  • 感谢@Mjh 的提示。我不确定我是否理解:有没有办法通过 php-fpm 将数据存储到服务器中,并让应用程序无需序列化即可检索该数据?
  • 我把你弄糊涂了,所以我很抱歉。问题在于,尚不清楚通过将上述数据存储到内存中究竟实现了什么,以及为什么需要重新启动服务器然后从内存中获取该数据。我发布关于php-fpm 的评论的原因是我不知道你为什么要重新启动服务器 - 所以在我看来,最好让 php 进程不受 HTTP 服务器发生的任何事情的影响,因此答案是使用 php-fpm (如果您的服务器操作系统使用 Windows,则不适用)。但是,由于 apc 可以满足您的要求,我认为我们最好将其保留下来以避免混淆。
猜你喜欢
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
  • 2015-12-29
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多