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



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

默认情况下,在CLI中使用APC缓存是浪费时间,因为在各个调用之间没有保留操作码缓存。但APC也包含apc_bin_dumpfile()apc_load_dumpfile()功能。

我想这两个函数可以用来在CLI模式下提高APC的效率,方法是在批处理作业之外的某个时间对其进行编译,将其存储在一个转储文件中,并让各个进程加载该转储文件。

有人有这种情况的经验吗?或者你能给出它会起作用或不会起作用的充分理由吗?是否可以合理地在内存使用或性能方面获得任何重大收益?阴影中隐藏着什么陷阱?

免责声明:尽管APC在CLI中工作时非常棒,但它也同样令人沮丧。要有健康的耐心使用,要彻底,如果你在旋转,请远离问题,记住你正在使用缓存,这就是为什么它看起来什么都没做,实际上什么都没有做。删除转储文件,从最基本的开始,如果不起作用,请忘记它尝试一台新机器,新操作系统,如果它正在工作,请制作一个副本,逐件扩展功能-有很多东西不起作用。如果它正在运行,请提交或制作一个拷贝,添加另一个片段并再次测试,以进行健全性检查,重新检查以前工作的副本,无论是否陈词滥调;如果一开始你没有成功,试着再试一次,你就不能继续做同样的事情,期待新的结果。

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

为cli启用apc

apc.enable-cli=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.ini中启用cli,这不值得沮丧,你会忘记你做了这件事,并对其他脚本有很多其他头疼的问题,相信我这不值得,而是使用启动程序脚本。(见下文)

cli中的apc_loadfile和apc_dumpfile

根据mightye php的评论,我们需要禁用apc.stat,否则您将收到警告

类似于:

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

<?php
/** check if dump file exists, you don't want to use file_exists */
if (false !== $dump_file = stream_resolve_include_path('apc.dump'))
    /** so where were we lets have a look see shall we */
    if (false !== apc_bin_loadfile($dump_file))
        /** fetch what was stored last run just for fun */
        if (false !== $value = apc_fetch('my.awesome.apc.store'))
            echo "$value from apcn";
/** store what gets fetched the next run just for fun */
apc_store('my.awesome.apc.store', 'awesome in cli');
/** what a shlep lets not do that all over again shall we */
apc_bin_dumpfile(array(),null,'apc.dump');

注意:为什么不使用file_exists?因为file_exists == stat你看到了,我们想要收获的回报就是apc.stat=0;在include路径内工作;使用绝对路径而非相对路径-如stream_resolve_include_path();返回的那样,避免使用include_oncerequire_once使用非*_once对应路径;当不使用APC(Muchos important senor)时,请在StreamWrapper echo的帮助下检查您的stat使用情况,以调用方法url_stat; Oops:致命的范围溢出错误!正在中止通知线程。请参阅url_stat消息:StreamWrapper导致的错误不在此讨论范围内。

烟雾测试

使用启动器执行基本脚本

./php-apc.sh apc-cli.php

一堆什么都没发生,这就是我们想要的,对吧,你为什么还要使用缓存?如果它确实输出了什么,那么它就不工作了,对不起。

应该有一个名为apc.dump的转储文件,看看你能不能找到它?如果你找不到它,那么它就不起作用了,对不起。

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

./php-apc.sh apc-cli.php

你想看的:

awesome in cli from apc

成功!=)

PHP中很少有能像工作中的APC实现那样令人满意
nJoy!

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

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

我尝试过卷曲和APC。它适用于

在CLI 中使用这些命令

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

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

最新更新