• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题

    问题背景

    通过启用Opcache的缓存优化,将PHP代码预编译为Opcode缓存到共享内存中供进程反复调用,从而减少了重复从磁盘解析PHP代码的时间消耗,显著的提高了PHP性能,提升了业务性能的调用,但是也引发了一些问题,就是我们每次更新了相应的PHP代码后,web server 无法即时加载到更新后的代码。

    解决方案

    (一)、设置Opcache脚本验证时间

    可以通过更改 Opcache 以下两个配置选项来调整代码重载时间

    opcache.revalidate_freq=0 检查脚本时间戳是否有更新的周期,以秒为单位。(如果设置为 0 会导致针对每个请求, OPcache 都会检查脚本更新)

    opcache.validate_timestamps=0 如果启用,那么 OPcache 会每隔 opcache.revalidate_freq 设定的秒数 检查脚本是否更新。

    PS:在实际生产环境中,为了尽可能达到最优性能,尽量不开启文件更新验证,因为每次验证都会重新预编译PHP代码到共享内存中。

    (二)、重启 | 重载 php-fpm 进程

    每次重启或重启 php-fpm 进程便会重新解析PHP脚本文件,但是重启 fpm 进程可能会导致请求中断,从而导致写入脏数据 或者 造成事务回滚等一系列异常。

    重载相对于重启则平顺很多,不会导致用户请求直接中断,相对来说风险低很多,但是php-fpm 收到reload信号,便会向所有子进程发送SIGGUIT信号,同时注册一个定时器,在规定的时间之内子进程没有退出,接着在发送SIGTERM信号,结束子进程。如果在一秒之内子进程还是没结束 直接发送SIGKILL 强制杀死。

    重启php-fpm

    service php-fpm restart

    重载php-fpm

    services php-fpm reload
    
    或 kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

    (三)、手动清理缓存

    除了上面的两种方式,还有更为稳妥一点的缓存清理,我们可以通过opcache_reset()和opcache_invalidate() 函数来刷新Opcache缓存。

    opcache_reset() - 重置整个Opcode缓存,所有的PHP脚本将会被重新解析再预编译为Opcode。

    opcache_invalidate() - 清除指定脚本缓存,可以传递两个参数,一个是刷新文件路径,一个是force字段, 如果 force 没有设置或者传入的是 FALSE,那么只有当脚本的修改时间 比对应Opcode的时间更新时,脚本的缓存才会失效。

    需要注意的是,当PHP以PHP-FPM的方式运行的时候,opcache的缓存是无法通过php命令进行清除的,只能通过http或cgi到php-fpm进程的方式来清除缓存,我们可以编写一个对外接口,来达到清理缓存的目的。

    相关实现如下(框架:laravel):

    Route::any('cache-reset', function () {
      //重置整个Opcode缓存
      dd(opcache_reset());
    });
    
    Route::any('cache-update', function () {
      //清除掉最近一次更新文件的缓存
      exec('git diff --name-only HEAD~ HEAD', $output);
      foreach ($output as $file) {
        $path = base_path($file);
        opcache_invalidate($path, true);
      }
      dd('刷新完成');
    });

    总结

    通过上面的三种策略,可以实现 Opcache 缓存更新的目的,但是在流量高峰期或者大流量的服务端,每次更新缓存都是一件非常损耗资源的事情,Opcache在重建缓存时,也不会禁止其他进程读取,因此就会造成反复新建缓存,因此想要达到最佳的性能调配:

    以上就是解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题的详细内容,更多关于PHP Opcache 缓存刷新、代码重载的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • 详解PHP7开启OPcache和Swoole性能的提升对比
    • 如何使用OPCache提升PHP的性能
    • PHP如何开启Opcache功能提升程序处理效率
    • php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
    • 启用OPCache提高PHP程序性能的方法
    • PHP解决高并发问题(opcache)
    上一篇:WordPress免插件实现面包屑导航的示例代码
    下一篇:PHP连接SQL server数据库测试脚本运行实例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题 解决,PHP,Opcache,缓存,刷新,