Zend Opcache 不缓存所有文件(CentOS 6.7 + Nginx 1.8.1 + PHP 7 + Laravel 5.1)

Posted

技术标签:

【中文标题】Zend Opcache 不缓存所有文件(CentOS 6.7 + Nginx 1.8.1 + PHP 7 + Laravel 5.1)【英文标题】:Zend Opcache not caching all files (CentOS 6.7 + Nginx 1.8.1 + PHP 7 + Laravel 5.1) 【发布时间】:2016-09-18 04:52:12 【问题描述】:

所以,我们有一个基于 Laravel 5.1 的项目,我们希望尽快发布,但我们注意到性能不佳,我们正在尝试优化服务器设置。

如标题所示,我们将其部署在 CentOS 6.7 服务器上,使用 nginx 1.8.1 和 php 7 以及 PHP-FPM。由于 CentOS 6.7 的软件库不提供 PHP 7,我们正在使用 IUS 的替换软件包。

我们注意到可能导致性能不佳的一件事是,尽管 Zend Opcache 已启用并正常工作(我们的命中率很高),但似乎并未缓存我们项目中的所有文件。我们使用 opcache-gui 来帮助可视化缓存的内容,虽然许多项目的文件都在那里(包括来自第三方库的文件),但大部分都丢失了,包括我们的主控制器和许多支持类。事实上,当我们禁用 Opcache 时,响应时间几乎保持不变。 opcache 黑名单目前是空的,所以这不是他们没有被包括在内的原因。

我们尝试使用 opcache_compile_file() 强制缓存丢失的文件,虽然文件确实被编译和缓存,但它们从未得到任何命中。

据我了解,Opcache 会缓存所有正在执行的文件,但这似乎不是这里发生的事情。我查看了 opcache 设置,但除了黑名单之外,找不到明显影响这种行为的设置。

我还有什么遗漏的吗? PHP 在决定缓存什么时会依赖其他标准吗?

如有任何帮助,我们将不胜感激!

【问题讨论】:

我想我要提到的另一件事,我知道 opcache 能够处理的加速文件的数量是有限制的,可以在 opcache.ini 文件设置中调整 @987654321 @。我们目前将其设置为 8000,这应该足以覆盖我们所有的文件,但是最终只有大约 163 个被缓存。 内存消耗似乎也不是问题,因为我们已通过opcache.memory_consumption 分配了 128MB,opcache-gui 显示仅使用了 23.1MB。 这个有什么解决办法吗?我也有同样的问题。 出于好奇。如果你设置 opcache.validate_timestamps=0 会发生什么? 【参考方案1】:

你能检查opcache.max_file_size的值吗?也许这是您的问题,因为编译后的文件比原始文件大。

你能用http://php.net/opcache-is-script-cached测试你在opcache-gui中看不到的文件吗?

另外,作为测试,您可以尝试强制编译吗?使用http://php.net/opcache-compile-file 处理此事。就是先看看有没有true能不能编译。

【讨论】:

以上是关于Zend Opcache 不缓存所有文件(CentOS 6.7 + Nginx 1.8.1 + PHP 7 + Laravel 5.1)的主要内容,如果未能解决你的问题,请参考以下文章

现代 PHP 新特性 —— Zend Opcache (转)

PHP安装使用Zend Opcache扩展

PHP安装使用Zend Opcache扩展

modern php enable zend opcache

PHP 被设置为移除内联块,这将导致多个核心应用无法访问。 这可能由缓存/加速器导致的,例如 Zend OPcache 或 eAccelerator。

PHP5.5+启用OPCache