PHP 中的 APC 模块在 CLI 模式下运行时是否支持代码优化?例如,当我运行一个文件时,php -f <file>
该文件是否会在执行之前使用 APC 进行优化?假设 APC 设置为加载到配置文件中。另外,附带的脚本require_once
也会被优化吗?
我知道在 fastcgi 模式下运行时优化效果很好,但我想知道它是否也适用于 CLI。
apc_* 函数有效,但我想知道代码优化,这是我在这里追求的主要内容。
快乐的一天,马蒂奇
PHP 中的 APC 模块在 CLI 模式下运行时是否支持代码优化?例如,当我运行一个文件时,php -f <file>
该文件是否会在执行之前使用 APC 进行优化?假设 APC 设置为加载到配置文件中。另外,附带的脚本require_once
也会被优化吗?
我知道在 fastcgi 模式下运行时优化效果很好,但我想知道它是否也适用于 CLI。
apc_* 函数有效,但我想知道代码优化,这是我在这里追求的主要内容。
快乐的一天,马蒂奇
apc.enable_cli
控制是否应在 CLI 模式下激活 APC的文档说(引用):
主要用于测试和调试。设置此项为 PHP 的 CLI 版本启用 APC。在正常情况下,在每个 CLI 请求上创建、填充和销毁 APC 缓存并不理想,但对于各种测试场景,能够轻松地为 PHP 的 CLI 版本启用 APC 很有用。
也许 APC 会将操作码存储在内存中,但随着 PHP 可执行文件在脚本结束时终止,该内存将丢失:它不会在脚本执行之间持续存在。
所以 APC 中的 opcode-cache 在 CLI 模式下是无用的:它不会优化任何东西,因为 PHP 每次启动 PHP 的可执行文件时仍然需要将源重新编译为操作码。
实际上,APC 并没有“优化”:执行 PHP 脚本的标准方式是这样的:
APC 所做的是将操作码存储在内存中,因此 PHP 脚本的执行变为:
但这意味着你必须在内存中有一些地方来存储操作码。当 PHP 作为 Apache 模块运行时,Apache 负责该内存段的持久性……当 PHP 从 CLI 运行时,没有任何东西可以保留内存段,因此它在 PHP 执行结束时被销毁。
(我不知道它是如何工作的,但至少在原理上是这样的,即使我的话不是很“技术性”^^)
或者,“优化”是指操作码缓存以外的其他东西,比如配置指令apc.optimization?如果是这样,这一项已在 APC 3.0.13 中删除
如果您有基于环境生成任何配置的 CLI 代码,则 CLI 代码将认为 APC 未启用。例如,当通过 CLI 生成 Symfony 的 DI 容器时,它会告诉 Doctrine 不要使用 APC(详情)。
此外,我还没有对其进行测试,但 APC 有可能会提高pcntl_fork()
. 编辑:我问过关于APC & pcntl_fork()
here的问题。
为了完整起见,在 CLI(在 Ubuntu 中)上启用 APC:
echo 'apc.enable_cli = 1' > /etc/php5/cli/conf.d/enable-apc-cli.ini
好吧,在 CLI 模式下使用 APC 是有充分理由的: 单元测试:我想使用尽可能接近后期生产环境的环境进行单元测试。Zend Framework 有一个内部缓存解决方案,它可以使用 APC 的变量缓存作为存储后端——我想使用它。
在 CLI 模式下使用它还有另一个原因:一些脚本能够将其用作缓存