20

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

我知道在 fastcgi 模式下运行时优化效果很好,但我想知道它是否也适用于 CLI。

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

快乐的一天,马蒂奇

4

4 回答 4

29

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 中删除

于 2009-08-07T15:25:18.327 回答
6

如果您有基于环境生成任何配置的 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
于 2013-05-24T09:37:41.367 回答
3

好吧,在 CLI 模式下使用 APC 是有充分理由的: 单元测试:我想使用尽可能接近后期生产环境的环境进行单元测试。Zend Framework 有一个内部缓存解决方案,它可以使用 APC 的变量缓存作为存储后端——我想使用它。

于 2011-01-13T16:03:26.443 回答
2

在 CLI 模式下使用它还有另一个原因:一些脚本能够将其用作缓存

于 2011-06-27T20:22:55.743 回答