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?
}
答案 0 :(得分:3)
APC在两种情况下对CLI模式有影响:
请注意,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
性能,还应该影响代码本身的性能。