为啥 PHP 5.5 的 OPcache 显示零命中? suPHP 的罪魁祸首?

Posted

技术标签:

【中文标题】为啥 PHP 5.5 的 OPcache 显示零命中? suPHP 的罪魁祸首?【英文标题】:Why is PHP 5.5's OPcache showing zero hits? suPHP the culprit?为什么 PHP 5.5 的 OPcache 显示零命中? suPHP 的罪魁祸首? 【发布时间】:2014-04-18 04:38:25 【问题描述】:

PHP 5.5 的 OPcache 扩展已在我的(共享)网络主机上启用,但由于某种原因,它总是在统计信息中报告“0 次点击”。会不会是因为不兼容suPHP

或者任何人对为什么有 0 次缓存命中有任何其他建议?

【问题讨论】:

【参考方案1】:

可以为 CLI 和基本 GCI 轻松启用 OPcache,但除非 php 进程在多个请求中持续存在,否则您只会在 人为 场景中看到缓存命中 - 例如在同一个请求中多次编译同一个脚本时。 (我说做作,因为这样的脚本无法定义全局命名空间实体,例如类或函数,因为第二次和后续编译会失败。)

在大多数共享主机配置中,系统管理员会将 PHP 配置为一次性 php-cgi 执行,即 PHP 映像在托管帐户 UID 内基于每个请求启动。这具有简单和安全的优点。这也有性能差的缺点,因为 PHP 映像启动开销是在每个请求的基础上产生的,并且由于 mmap 的 SMA 在映像关闭时被丢弃,所以任何编译的脚本都不会在请求之间持续存在。

要使 OPcache 正常工作,您需要有能够在请求爆发时持续存在的 PHP 进程。一些 mod_fcgid 模式确实支持这一点,但是如果没有您的配置的更多详细信息,我无法为您提供任何进一步的指导。对不起。

【讨论】:

【参考方案2】:

我被告知目前没有任何 opcache 扩展与 suPHP 兼容,很遗憾。

LiteSpeed 的 suEXEC 可以支持操作码缓存,但只能在“守护进程”或“进程组”模式下,不在标准的“worker”模式下 (see their explanation here)。

因此,即使您可以在 cPanel 中或通过 INI 启用 opcache,您也不会获得缓存命中,因为 PHP 进程结束并且 RAM 被释放。看来我暂时不走运了。

【讨论】:

@Prateek - 根据我所做的一些研究,操作缓存需要一个持久进程来将缓存存储在 RAM 中。因此,您需要使用 mod_php(使用 Apache)、PHP-FPM、FastCGI 或类似的东西。我不认为直接的 CGI 保持一个持久的过程,所以可能无法正常工作。 Roger 那,所以我转向 FCGI 来使用 opcache。是的,它有效,谢谢@Simon

以上是关于为啥 PHP 5.5 的 OPcache 显示零命中? suPHP 的罪魁祸首?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 5.5 OPCache 不适用于 apache

使用 OpCache 提升 PHP 5.5+ 程序性能

apache_conf 关闭php 5.5 OPCache

无法在 Centos 6.4 上安装 php 5.5 opcache

PHP5.5+启用OPCache

求救,为啥PHP 开启opcache后,访问502 Bad Gateway错误