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-cachekill -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

上一篇:高阶函数


下一篇:VXFS启用异步IO导致的严重问题