CLI 模式下的 PHP APC

在CLI模式下运行时,PHP中的APC模块是否支持代码优化?例如,当我运行一个文件时,该文件在执行之前是否会使用APC进行优化?假设 APC 设置为在配置文件中加载。另外,附带的脚本是否也会得到优化?php -f <file>require_once

我知道优化在fastcgi模式下运行时工作正常,但我想知道它是否也适用于CLI。

apc_*函数工作,但我想知道代码优化,这是我在这里追求的主要内容。

快乐的一天,马蒂奇


答案 1

apc.enable_cli的文档控制是否应在CLI模式下激活APC,该文档说(引用):

主要用于测试和调试。设置此项将为 CLI 版本的 PHP 启用 APC。在正常情况下,在每个CLI请求上创建,填充和销毁APC缓存并不理想,但对于各种测试场景,能够轻松地为PHP的CLI版本启用APC是很有用的。

也许APC会将操作码存储在内存中,但是由于PHP可执行文件在脚本末尾死亡,该内存将丢失 :它不会在脚本执行之间保留。

因此,APC中的操作码缓存在CLI模式下是无用的:它不会优化任何东西,因为每次启动PHP的可执行文件时,PHP仍然必须将源代码重新编译为操作代码。


实际上,APC并没有“优化”:执行PHP脚本的标准方式是这样的:

  • 读取文件,并将其编译为操作码
  • 执行操作码

APC所做的是存储在内存中的操作码中,因此PHP脚本的执行变为:

  • 从内存中读取操作码(比编译源代码快得多)
  • 执行操作码

但这意味着您必须在内存中具有某个位置来存储操作码。当将PHP作为Apache模块运行时,Apache负责该内存段的持久性...当PHP从CLI运行时,没有任何东西可以保留内存段,因此在PHP执行结束时会销毁它。
(我不知道它是如何工作的,但它就是这样,至少在原则上是这样,即使我的话不是很“技术性”^^)


或者,通过“优化”,您的意思是操作码缓存以外的其他东西,例如配置指令apc.optimization?如果是这样,这个已在APC 3.0.13中删除


答案 2

如果您有基于环境生成任何配置的 CLI 代码,则 CLI 代码将认为未启用 APC。例如,当通过 CLI 生成 Symfony 的 DI 容器时,它会告诉 Doctrine 不要使用 APC(详细信息)。

另外,我还没有测试过它,但是APC有可能提高在.编辑:我在这里问了关于APC和pcntl_fork()的问题。pcntl_fork()

为了完整起见,要在 CLI 上启用 APC(在 Ubuntu 中):

echo 'apc.enable_cli = 1' > /etc/php5/cli/conf.d/enable-apc-cli.ini

推荐