与pcntl_fork()一起使用时,APC可以提高CLI脚本的速度吗?

时间:2013-05-24 09:45:17

标签: php apc pcntl

APC的工作原理是将PHP文件中的操作码存储在共享内存中。当PHP与Web服务器(例如Apache)一起使用时,共享内存的使用寿命很长。从命令行调用时,将为每个进程创建和销毁APC缓存。默认情况下,在commadnline上禁用APC,可能是由于此原因。

我有一个理论认为,如果PHP进程是分叉的,那么使用APC会带来好处(使用pcntl_fork()可能会使用相同的操作码缓存。这可能只适用于fork之后包含的文件。 / p>

对此进行基准测试的最佳方法是什么?任何人都可以测试这个或解释理论是否正确吗?

<?php
if (pcntl_fork()) {
    // parent
    include 'huge-file.php';
} else {
    // child
    sleep(1); // stop race condition
    include 'huge-file.php'; // will this use APC's cache?
}

1 个答案:

答案 0 :(得分:3)

APC在两种情况下对CLI模式有影响:

  • 通过相同的脚本(例如包含某些数据缓存的文件)或多个进程重复包含相同的文件
  • 您使用apc_fetch()(如果禁用apc,则始终返回false)

请注意,APC默认情况下会在CLI中禁用它自己;您必须使用apc.enable_cli=1启用它。

这是一个快速的基准:

<?php                                                                           

for ($i = 0; $i < 1000; ++$i) {                                                 
    // cache.php contains the output of 'var_export(get_defined_constants(true))'
    require 'cache.php';                                                   
}

没有apc的结果:

$ time php test.php

real    0m1.219s
user    0m1.208s
sys     0m0.008s

apc:

的结果
$ time php -dapc.enable_cli=1 test.php

real    0m0.252s
user    0m0.244s
sys     0m0.004s

在这种情况下,APC确实会对性能产生重大影响。


使用pcntl_fork(),APC应该比在apache的mod_php或php-fpm下运行多个PHP脚本具有完全相同的影响:如果多个子脚本包含相同的文件,则包含的文件将只被解析一次。


在PHP 5.5中,替换APC的捆绑opcache扩展也优化了代码,因此它不仅应该影响require性能,还应该影响代码本身的性能。