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

标签 php apc pcntl

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

我有一个理论,如果 PHP 进程被 fork (使用 pcntl_fork() ,大概可以使用相同的操作码缓存),那么使用 APC 会有好处。这可能只适用于包含的文件 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 模式产生影响:

  • 同一文件被同一脚本(例如包含某些数据缓存的文件)或多个进程重复包含
  • 您使用 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 性能,还会影响代码本身的性能。

关于php - APC 与 pcntl_fork() 一起使用时可以提高 CLI 脚本的速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16732048/

相关文章:

php - PHP APC 的最大 key 长度是多少?

php - posix_kill 与 pcntl_signal

PHP:如何检查响应代码?

PHP:使用 APC 作为通用缓存,XCache 作为 opcache,可能吗?

caching - 如何清除 APCu 中的用户缓存?

php - pcntl_fork 在 PHP 中如何工作?

php - fork PHP 应用程序中的单个数据库连接

php - 如何从 MD5 恢复密码?

javascript - 按钮点击调用PHP函数

php - MySQL 循环或嵌套查询