APC 的工作原理是将 PHP 文件中的操作码存储在共享内存中。当 PHP 与 Web 服务器(例如 Apache)一起使用时,共享内存的寿命很长。当从命令行调用时,将为每个进程创建和销毁 APC 缓存。默认情况下,APC 在命令行上被禁用,可能是由于这个原因。
我有一个理论,如果 PHP 进程被分叉(用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?
}
APC 在两种情况下对 CLI 模式产生影响:
- 同一文件被同一脚本(例如包含某些数据缓存的文件)或多个进程重复包含
- You use apc_fetch() http://php.net/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
性能,还包括代码本身的性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)