如何在CLI和Web Server实例之间共享APC用户缓存?

时间:2013-01-08 18:40:35

标签: apc php

我正在使用PHP的APC来存储大量信息(使用apc_fetch()等)。这些信息偶尔需要进行分析并转储到其他地方。

故事说,我得到几百次点击/秒。这些匹配会增加各种计数器(apc_inc()和朋友)。每个小时,我想迭代我积累的所有值,并对它们进行其他处理,然后将它们保存在磁盘上。

我可以在每个请求中以随机或基于时间的方式执行此操作,但这是一个可能很长的操作(可能需要20-30秒,如果不是几分钟)并且我不想挂起那么长的请求

我认为一个简单的PHP cronjob可以完成任务。但是,我甚至无法回读信息。

<?php
  print_r(apc_cache_info());
?>

显示一个看似不同的APC内存段,其中包括:

[num_entries] => 1

(单个条目似乎是自身的操作码缓存)

虽然我的网络服务器由nginx / php5-fpm提供,但产生了:

[num_entries] => 3175

所以,他们显然没有共享相同的内存块。如何在CLI脚本(首选)中访问相同的内存块,或者如果根本不可能,那么执行长时间运行的序列的绝对最安全的方法是什么,比如每小时一次随机的HTTP请求?

对于后者,会使用register_shutdown_function()并立即使用set_time_limit(0)ignore_user_abort(true)来确保执行完成并且不会“挂起”任何人的浏览器吗?

是的,我知道redis,memcache等不会有这个问题,但我现在仍然坚持使用APC,因为它们都没能表现出与APC相同的速度。

1 个答案:

答案 0 :(得分:0)

这确实是一个设计问题,需要选择首选成本与收益。

您对APC的速度感到非常兴奋,因为您没有花时间来保存数据。您还希望保留数据,但现在性能损失太大了。你必须以某种方式平衡这些。

如果持久性很重要,请在每个请求中执行命中和持久化(文件,数据库等)。如果速度是你所关心的,那就什么都不改变 - 整个问题变得毫无意义。存在具有持久存储的缓存系统,其可以通过聚合写入磁盘的内容来优化磁盘写入,但是通常总是在具有不同临界点的两者之间具有收益。您只需选择适合您目标的那些。

狼可能永远不会存在一种持久的,有益健康的技术解决方案,而且羊是完整的。

如果您真的必须按照自己的方式进行操作,那么您可以使用一个cron,向您的应用程序发送一个特殊请求,这将触发将缓存保存到磁盘。这样您就可以控制请求,超时等,并且不必担心用户可能会做出的任何事情来杀死他们的请求。

然而,在这种情况下,潜在的风险是数据完整性(因为您将在同时更新其他请求时将缓存写入磁盘)以及在您持续缓存支付时请求服务的请求服务器的性能损失很快。

基本上,我们在狼/羊羔困境中引入了一捆干草;)