2

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

我有一个理论,如果 PHP 进程是分叉的,那么使用 APC 会有好处(pcntl_fork()大概可以使用相同的操作码缓存。这可能只适用于分叉后包含的文件。

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

<?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?
}
4

1 回答 1

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性能,还会影响代码本身的性能。

于 2013-05-24T09:47:42.893 回答