php字节码缓存之opcache
PHP5.5 以后官方自带了一个组件叫 Zend Opcache,具体可以参看官方文档(https://www.php.net/manual/zh/book.opcache.php)。开启此扩展后可以提高 PHP 的执行效率。
Opcache是字节码缓存,PHP在被编译的时候,首先会把php代码转换为字节码,字节码然后被执行。
php文件第二次执行时,同样还是会重新转换为字节码,但是很多时候,文件内容几乎是一样的,比如静态HTML文件,生成后内容许久都不会改变,用户访问请求直接由服务器读取响应给客户端浏览器。都不用经过PHP进行解析构建了。
内存中的字节码数据,可以直接缓存进行二次编译。这样程序就会快一些,cpu的消耗也少了。
(这里字节码 就是 opcode)
在配置中有 2 个配置很重要,需要重点关注
opcache.validate_timestamps=0;
opcache.revalidate_freq=60;
validate_timestamps 用于验证是否要重新生成缓存脚本, 如果设置为 0(性能最佳),需要手动在每次 PHP 代码更改后手动清除 OPcache。 如果此值为 0,那么 revalidate_freq 将失去作用。
revalidate_freq 用于控制 opcache 多久生成一次缓存字节码,默认 60s。所以一般我们在开发环境中将上面两个值配置为
opcache.validate_timestamps=1;
opcache.revalidate_freq=1;
或者干脆直接关闭 opcache。
上面提到了,如果将 validate_timestamps 配置为 0 以后,我们每次部署 PHP 的时候默认是不会自动生成缓存。
生产环境解决方案1
服务器安装宝塔面板webhook,代码提交到码云,然后触发码云的钩子,码云钩子在触发宝塔webhook,宝塔webhook通过执行shell脚本,拉取仓库代码,然后在重启对应php版本的php-fpm
#!/bin/sh
WEB=/www/wwwroot/youpinhui.guanhuaitong.com/
cd $WEB && /usr/bin/svn update --username 613154514@qq.com --password 123456 --no-auth-cache
kill -USR2 `cat /www/server/php/73/var/run/php-fpm.pid`
方案2
利用php函数opcache_reset(),大概实现方案就是写个接口,然后在代码更新完毕之后,调用这个接口,接口去实现opcache_reset()这个方法即可。
推荐一个opcache单页面面板,只有一个页面放到web站点根目录就可以访问了,生产环境建议自己增加访问权限。
https://github.com/rlerdorf/opcache-status
版权声明:若无特殊注明,本文皆为《菜鸟站长》原创,转载请保留文章出处。
本文链接:php字节码缓存之opcache - https://wlphp.com/?post=253