玖叶教程网

前端编程开发入门

线上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个机器从一台代码服务器上拉取代码存在延迟导致的。

解决方法

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

2. 工具 Cachetool

3. 手动重启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

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言