使用转储文件在CLI模式下使用PHP APC缓存

使用转储文件在CLI模式下使用PHP APC缓存,php,cron,command-line-interface,apc,Php,Cron,Command Line Interface,Apc,我最近开始在我们的服务器上使用APC缓存。我们产品最重要的部分之一是CLI(Cron/scheduled)进程,其性能至关重要。通常,batchjob包括并行运行16-32个进程约一小时(它们每隔几分钟“重新启动”) 默认情况下,在CLI中使用APC缓存是一种浪费时间的行为,因为操作码缓存在各个调用之间没有保留。但是APC还包含APC\u bin\u dumpfile()和APC\u load\u dumpfile()函数 我在想,这两个函数可以用来让APC在CLI模式下高效运行,方法是在bat

我最近开始在我们的服务器上使用APC缓存。我们产品最重要的部分之一是CLI(Cron/scheduled)进程,其性能至关重要。通常,batchjob包括并行运行16-32个进程约一小时(它们每隔几分钟“重新启动”)

默认情况下,在CLI中使用APC缓存是一种浪费时间的行为,因为操作码缓存在各个调用之间没有保留。但是APC还包含
APC\u bin\u dumpfile()
APC\u load\u dumpfile()
函数

我在想,这两个函数可以用来让APC在CLI模式下高效运行,方法是在batchjob之外的某个时间进行编译,存储在单个转储文件中,并让各个进程加载转储文件


有没有人有过这种情况的经验,或者你能给出一个很好的理由来说明它会或不会起作用?如果在内存使用或性能方面可以合理地获得任何显著的收益?隐藏在阴影中的陷阱是什么?

我肯定不会在CLI中使用它,因为当您重新启动它时,它几乎就像从未运行过一样


使用APC的更好方法是让它一直在Web服务器上运行,这样当它处于活动状态时,它将实际执行它应该执行的操作

免责声明:当APC在CLI中工作时,它和APC一样棒,而且它也非常棒,同样令人沮丧。使用时要有足够的耐心,要彻底,如果你正在旋转,请远离问题,记住你正在使用缓存,这就是为什么它看起来什么都不做,实际上什么都不做的原因。删除转储文件,从基本内容开始,如果不起作用,请忘记它尝试一台新机器、新操作系统,如果它正在工作,请制作一个副本,逐件展开功能-有很多东西不起作用,如果它正在工作,请提交或制作一个副本,添加另一件,然后再次测试,检查是否正常,重新检查以前工作过的副本,陈词滥调与否;如果一开始你没有成功,再试一次,你就不能继续做同样的事情,期待新的结果

准备好了吗?这就是你一直在等待的:

为cli启用apc =1

在每个CLI请求上创建、填充和销毁APC缓存并不理想

   - previous answer by unknown poster since removed.
你说得很对,那太糟糕了,让我们把它修好,好吗

如果您尝试在CLI下使用APC,但未启用,则会收到警告

比如:

PHP Warning:  apc_bin_loadfile(): APC is not enabled, 
              apc_bin_loadfile not available.
PHP Warning:  apc_bin_dumpfile(): APC is not enabled, 
              apc_bin_dumpfile not available.
PHP Warning:  apc_bin_dumpfile(): Excluding some files from apc_bin_dump[file].  
              Cached files must be included using full path with apc.stat=0. 
警告:我建议您不要在php.ini中启用cli,这不值得沮丧,您会忘记您已经启用了cli,并且会对其他脚本产生许多其他问题,相信我,这不值得,请改用启动脚本。(见下文)

cli中的apc_加载文件和apc_转储文件 根据评论,我们需要禁用,否则您将收到警告

比如:

PHP Warning:  apc_bin_loadfile(): APC is not enabled, 
              apc_bin_loadfile not available.
PHP Warning:  apc_bin_dumpfile(): APC is not enabled, 
              apc_bin_dumpfile not available.
PHP Warning:  apc_bin_dumpfile(): Excluding some files from apc_bin_dump[file].  
              Cached files must be included using full path with apc.stat=0. 
启动程序脚本-php-apc.sh 我们将使用此脚本启动启用apc的脚本(例如
/php-apc.sh apc cli.php
),而不是直接更改
php.ini
中的属性

#/bin/sh
php -d apc.enable_cli=1 -d apc.stat=0 $1
准备好基本功能了吗?你肯定是……)

基本APC持久化-APC-cli.php 一大堆事情都没发生这正是我们想要的对,不然你为什么要使用缓存?如果它确实输出了什么,那么它就不工作了,对不起

应该有一个名为apc.dump的转储文件,看看是否可以找到它?如果你找不到,那它就没用了,对不起

很好,我们有转储文件。没有错误。让我们再次运行它

./php-apc.sh apc-cli.php
您希望看到的内容:

awesome in cli from apc
成功!=)

在PHP中,很少有比APC实现更令人满意的了。

哎呀

我尝试了curl和APC。它很有效

在CLI中使用这些命令

curl --data "param1=value2" http://testsite.com/test.php

因此,它会将数据发布到test.php,您可以在其中编写代码。

我没有得到关于为什么在CLI中使用APC是浪费时间的部分?您所说的操作码不在单独调用之间保留是什么意思?APC必须在每次重新启动时重建操作码缓存。当与Web服务器一起使用时,只要计算机处于活动状态,它就会保持活动状态,但在CLI模式下,每个进程都有自己的APC,因此对于每个进程,它必须重建操作码缓存。由于APC通过不必为每个PHP脚本构建操作码来提高性能,因此它几乎否定了您可能获得的任何性能优势。我正在想办法解决这个问题。希望这不会显得迟钝,但你试过了吗?这是一个聪明的解决办法,但愿我自己也考虑过。我以前也遇到过类似的问题,我更喜欢使用Node.js(和forever)进行定时循环。在这种情况下,编译时间真的很重要吗?与本例中的运行时相比,它似乎非常小。@wolfgang该场景主要影响内存使用。我使用CLI模式并行运行任务(作为穷人的多线程)。每个任务需要的内存越少,我可以并行运行的任务就越多。显然,我已经在Web服务器上运行了它。但我也希望在CLI模式下使用它,以减少内存配置文件。默认情况下,APC不会有多大帮助,因为每次运行时它都必须重新编译文件,但我想知道是否可以使用APC转储文件跳过编译步骤。是的,只要在此期间没有变量发生更改,您就可以跳过编译步骤。因此,基本上,如果需要重新缓存任何内容,则需要重新编译!在MAC OS X 10.6.8上定制编译的PHP5.3.14(cli)(构建时间:2012年7月7日21:32:43)回答得非常好!不过,对于统计数据的限制,我感到很难过。在我的特殊情况下,我需要包括一个相当大的框架,其中充满了include,这样我就可以为自己裁剪工作了。无论哪种方式,这应该是一个很好的基础开始实验。你有没有经验,是否启用APC在CLI这样,实际上提高了性能和/或内存使用?没有任何限制