11

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

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

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

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

4

3 回答 3

13

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

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

为 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 apc\n";

/** 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;在包含路径中工作;使用绝对路径而不是相对路径 - 正如 Avoid 返回的那样stream_resolve_include_path();include_once使用require_once*_once对应路径;在不使用 APC (Muchos 重要传感器)时检查您的统计使用情况,借助 StreamWrapper 回显来调用方法url_stat;Oops:致命范围溢出错误!中止通知线程。请参阅url_stat 消息:StreamWrapper 导致的错误超出了本讨论的范围。

冒烟测试

使用启动器执行基本脚本

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

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

应该有一个叫apc.dump的dump文件,看看能不能找到?如果你找不到它,那么它没有工作,对不起。

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

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

你想看什么:

awesome in cli from apc

成功!=)

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

于 2012-08-10T20:51:51.857 回答
0

绝对不会在 CLI 中使用它,因为当你重新启动它时,它几乎就像一开始就没有运行过一样!

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

于 2012-07-24T10:16:40.183 回答
-2

我尝试使用 curl 和 APC。它有效

在 CLI 中使用这些命令

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

所以它会将数据发布到 test.php 并在其中编写代码。

于 2013-09-16T11:12:26.490 回答