线上opcache问题分析

一、问题
今天上线新功能,有一个接口原始请求方式是get,后来改为post方式,预发环境测试正常,然后发布到线上,线上直接报错,错误信息如下:

[2017-11-29 19:09:02] xxxx,line:242 message:[code => 405 | msg => 请求方法错误(GET or POST)。

二、追查
提示就是请求方式错误,但是看代码一切正常,直接op重启php-fpm,然后正常了,线上开启了opcache,但是在发布代码后会自动触发fpm重启,不过并没有生效,追查问题。

查看路由文件(stat):
Access: 2017-11-29 18:28:17.553780923 +0800
Modify: 2017-11-29 18:35:15.539780895 +0800
Change: 2017-11-29 18:35:16.539780895 +0800

fpm重启正常,发现最后访问时间明显比modify时间晚,说明更新后并没有访问文件,还是走的缓存。大致问题在于机器更新代码并未完成时,fpm就重启了,这两个操作存在秒级差的问题,偶现,应该和一次上线n个机器从一台代码服务器上拉取代码存在延迟导致的。

三、解决方法

在根目录建立一个php文件,里面包含opcache_reset(),通过http请求(浏览器)来运行(最好限制下本地IP运行),因为opcache_reset在某些模式下不支持cli模式,所以为了统一,最好都通过http请求运行

  1. 工具 Cachetool

  2. 手动重启fpm,强制opcache更新

四、opcache配置项
开启方式:在php.ini中设置

[opcache]zend_extension = "G:/PHP/php-5.5.6-Win32-VC11-x64/ext/php_opcache.dll"

;Zend Optimizer + 的开关, 关闭时代码不再优化

opcache.enable=1

;Determines if Zend OPCache is enabled for the CLI version of PHP

opcache.enable_cli=1

;Zend Optimizer + 共享内存的大小, 总共能够存储多少预编译的 PHP 代码(单位:MB); 推荐 128

opcache.memory_consumption=64

;Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB); 推荐 8

opcache.interned_strings_buffer=4

;最大缓存的文件数目 200 到 100000 之间; 这个选项用于控制内存中最多可以缓存多少个PHP文件。这个选项必须得设置得足够大,大于你的项目中的所有PHP文件的总和

opcache.max_accelerated_files=2000

;内存“浪费”达到此值对应的百分比,就会发起一个重启调度.

opcache.max_wasted_percentage=5

;开启这条指令, Zend Optimizer + 会自动将当前工作目录的名字追加到脚本键上,; 以此消除同名文件间的键值命名冲突.关闭这条指令会提升性能,; 但是会对已存在的应用造成破坏.

opcache.use_cwd=0

;开启文件时间戳验证,当这个选项被启用(设置为1),PHP会在opcache.revalidate_freq设置的时间到达后检测文件的时间戳(timestamp)。如果这个选项被禁用(设置为0),opcache.revalidate_freq会被忽略,PHP文件永远不会被检查

opcache.validate_timestamps=1

;2s检查一次文件更新 注意:0是一直检查不是关闭; 推荐 60,这个选项用于设置缓存的过期时间(单位是秒),当这个时间达到后,opcache会检查你的代码是否改变,如果改变了PHP会重新编译它,生成新的opcode,并且更新缓存。值为“0”表示每次请求都会检查你的PHP代码是否更新

opcache.revalidate_freq=2

;允许或禁止在 include_path 中进行文件搜索的优化

opcache.revalidate_path=0

;是否保存文件/函数的注释 如果apigen、Doctrine、 ZF2、 PHPUnit需要文件注释; 推荐 0

opcache.save_comments=1

;是否加载文件/函数的注释

opcache.load_comments=1

;打开快速关闭, 打开这个在PHP Request Shutdown的时候会收内存的速度会提高,推荐 1

opcache.fast_shutdown=1

这里只列出部分配置,全部配置项请参考官方文档,关于opcache相关问题,欢迎留言讨论。

参考文档
http://php.net/manual/zh/opcache.configuration.php#ini.opcache.revalidate-freq

相关文章
相关标签/搜索