前言出处:长期以来,当我们的web服务器遇到大流量访问时,很容易将CPU负载飙升至100%,导致响应速度变慢,用户体验很差卡住。直到最近,在开启Opcahe之后,我们的QPS从200-300+提升了1000+,响应速度也提升了很多。经过几天的努力,大家终于有了一些小经验,终于可以分享一下了。在网上搜索一些关于Opcache配置优化的博客,很快就能搞定一堆配置,但是真的适用于当前的项目规模和资源模型吗?对此,下面会根据项目的实际情况来说明如何优化opcache的配置。这是网上推荐的配置。让我们尝试从实际情况调整这个配置。opcache.enable=1opcache.memory_consumption=512opcache.interned_strings_buffer=64opcache.max_accelerated_files=100000opcache.validate_timestamps=1opcache.revalidate_freq=60opcache.save_comments=1opcache.fast_shutdown=1我的PHP实验环境可能在不同版本略有不同:PHP7。.配置调整和优化opcache.enableopcache.enable-启用操作码缓存。如果禁用此选项,代码将不会被优化和缓存。所以我们需要将它设置为ON来启用Opcache。opcache.enable=1opcache.memory_consumptionopcache.memory_consumption-OPcache的共享内存大小,以兆字节(M)为单位。它的默认值为64M,但根据不同的项目、不同的规模有不同的设置。我们可以使用opcache_get_status函数来查看Opcahce消耗了多少内存,是否需要增加内存。Memory_usage在opcache_get_status中提供内存消耗信息。其值以字节(byte)为单位"memory_usage":{"used_memory":91647160,"free_memory":440537232,"wasted_memory":4686520,"current_wasted_percentage":0.8729323744773865},我们计算memory_consumption的公式为:fmemory+wasted_memory()/1048576那么这个配置的结果是:(91647160+440537232+4686520)/1048576=512Mmemory_consumption=512Minterned_strings_bufferinterned_strings_buffer-用于存储保留字符串的内存大小,以兆字节为单位。PHP使用一种称为字符串驻留的技术来提高性能。比如你在代码中使用字符串“aabbcccdd”1000次,PHP内部只会分配一个内存区域来存放第一次的字符串,剩下的999次会使用内存指针来引用该字符串.默认情况下,此优化将仅存在于单个PHP-FPM进程中,如果设置此选项,它将在所有PHP-FPM进程之间共享。在较大的项目中,这可以非常有效地节省内存和提高应用程序性能。这个选项的默认值为8MB,我们可以根据项目规模和实际情况调整这个值。opcache.interned_strings_buffer=8opcache.interned_strings_buffer=16opcache.max_accelerated_filesopcache.max_accelerated_files-可以存储在OPcache哈希表中的脚本文件的最大数量。实数值是质数集合{223,463,983,1979,3907,7??963,16229,32531,65407,130987}中找到的第一个大于或等于设定值的质数。设置值的最小取值范围为200,PHP5.5.6之前最大值为100000,PHP5.5.6之后为1000000。配置保存在内存中的文件个数,我们可以通过以下命令获取整个项目中php文件的个数。寻找。-typef-打印|grepphp|wc-l可以根据项目中的文件个数,从上面设置的质数中选择第一个>=的质数。我本地项目的运行结果是:find。-typef-打印|grepphp|wc-l18918则配置为:opcache.max_accelerated_files=32531opcache.validate_timestampsopcache.validate_timestamps启用该选项后,PHP将使用你的opcache.revalidate_freq值检查文件时间戳,以确定是否需要重新生成PHP脚本编译缓存。在生产环境模式下,如果项目流量比较大,请求比较密集,建议关闭该选项以获得最高性能。opcache.validate_timestamps=0设置关闭后,每次部署都无法立即更新代码。需要重启php-fpm进程或者使用kill-SIGUSR2平滑重启,最新代码才能生效。revalidate_freqrevalidate_freq-检查重新生效期的脚本时间戳,以秒为单位。设置为0会导致OPcache在每次请求时检查脚本更新。如果opcache.validate_timestamps配置指令设置为禁用,则此设置将被忽略。在本地或者开发环境中启用Opcache,我们可以设置为:opcache.revalidate_freq=0对于小流量服务器,可以设置为600s(10分钟),检查脚本更新opcache.revalidate_freq=600建议设置3600s适用于大中型服务器要么不检查脚本更新,要么在流量低峰期定时检查。opcache.revalidate_freq=3600save_commentssave_comments-如果禁用,脚本文件中的注释将不会包含在操作码缓存文件中,可以有效减少优化文件的大小。禁用该配置指令可能会导致某些依赖注解或注释的应用程序或框架无法正常工作,例如:Doctrine、ZendFramework2和PHPUnit。如果项目中没有使用依赖注解,这个选项可以关闭,否则应该打开。fast_shutdownfast_shutdown-如果启用,快速关闭将用于重新发送事件。所谓后续事件快停,是指依靠Zend引擎的内存管理模块一次性释放所有请求变量的内存,而不是依次释放每个分配的内存块。从PHP7.2.0开始,这个配置指令被移除了。快速停止重复事件的处理已经集成到PHP中,只要有可能,PHP就会自动处理这些重复事件。这个word配置会加快php-fpmworker进程的回收,从而可以更快的为下一次请求做好准备。在PHP7.2.0之前需要手动启用。opcache.fast_shutdown=1最后我们优化调整位置如下,覆盖到php.ini,重新加载php-fpm进程生效。opcache.enable=1opcache.memory_consumption=512opcache.interned_strings_buffer=64opcache.max_accelerated_files=32531opcache.validate_timestamps=0opcache.save_comments=1opcache.fast_shutdown=1end以上是opcache部分配置优化策略,合理使用OPcahce会降低Web的CPU占用率服务器速率,但会在一定程度上增加内存占用。如果使用get,这将大大提高服务器端和PHP的吞吐量。最后加入OPcahe的优化渲染。
