我正在使用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相同的速度。
答案 0 :(得分:0)
这确实是一个设计问题,需要选择首选成本与收益。
您对APC的速度感到非常兴奋,因为您没有花时间来保存数据。您还希望保留数据,但现在性能损失太大了。你必须以某种方式平衡这些。
如果持久性很重要,请在每个请求中执行命中和持久化(文件,数据库等)。如果速度是你所关心的,那就什么都不改变 - 整个问题变得毫无意义。存在具有持久存储的缓存系统,其可以通过聚合写入磁盘的内容来优化磁盘写入,但是通常总是在具有不同临界点的两者之间具有收益。您只需选择适合您目标的那些。
狼可能永远不会存在一种持久的,有益健康的技术解决方案,而且羊是完整的。
如果您真的必须按照自己的方式进行操作,那么您可以使用一个cron,向您的应用程序发送一个特殊请求,这将触发将缓存保存到磁盘。这样您就可以控制请求,超时等,并且不必担心用户可能会做出的任何事情来杀死他们的请求。
然而,在这种情况下,潜在的风险是数据完整性(因为您将在同时更新其他请求时将缓存写入磁盘)以及在您持续缓存支付时请求服务的请求服务器的性能损失很快。
基本上,我们在狼/羊羔困境中引入了一捆干草;)