使用Opcache提升Laravel性能

2,030 阅读4分钟

前言

最近在学习Laravel框架,也在看PHP基础知识,发现PHP程序每次对要去加载脚本文件,然后解析编译成字节码,最后再执行字节码,每次都有会这样,但是对已经上线的项目,每次这样去解析编码确实听浪费性能的,可以不可以下次直接使用执行字节码,这样执行的效率就要高很多了,发现PHP5.4之后就支持可以缓存字节码了,这篇文章就是讲解如何使用缓存字节码来提升PHP性能

使用Opcache扩展

OpcachePHP中的Zend扩展,通过这个扩展可以将php脚本解析编译后的字节码存储到共享内存中以提升PHP性能,这样就可以省去每次加载解析编译PHP脚本的开销了

查看是否安装Opcache扩展

查看是否安装OPcaceh扩展,有很多方式,这里主要讲解两种,

###使用命令php -m | grep OPcode 通过php -m | grep OPcode命令,查看结果有输出Zend OPcache,如果命令窗口没有信息输出表示没有安装扩展, php -m这个命令可以查看已经安装的php扩展

使用php -r "phpinfo();" | grep opcache 命令

phpinfo这个函数会输出很多的东西,我们只查看opcahce扩展相关的东西,再通过grep opcache过虑,如果没有得到任何东西,表示没有安装opcache扩展。

上面两种方式在使用grep命令过滤查询的时候需要注意一下,第一种方式是OPcache,第二种方式是opcache,注意下大小写,不然可能没有任何结果

这里不在赘述如何安装OPcache扩展,网络上也有很多的方法,这里会介绍如何使用Opcache

配置OPcache扩展

php.ini中查找opcache扩展中的内容进行配置,一开始不知道php.ini文件在哪里,可以用php -r "phpinfo();" | grep Loaded命令,可以看到Loaded Configuration File => /etc/php/7.2/cli/php.ini中就有php.ini的文件位置。

具体配置项目如下:

;开启 opcache, 0关闭,1开启
opcache.enable=1 

;生产环境中配置为0, 如果为 1, 则需要根据 revalidate_freq 配置的秒数 来检查更改。
;如果你把它设置为  0 (最好的性能),你需要在每次 PHP 代码改变时手动清除  OPcache
opcache.validate_timestamps=1 

;检查脚本时间戳是否有更新时间
opcache.revalidate_freq=2   

;Opcache的共享内存大小,以M为单位,根据你的需要选择一个高于 64M (默认值)的值。
opcache.memory_consumption=512    

;用来存储临时字符串的内存大小,以M为单位,存储预留字符串的内存多少 M. 选择一个高于 16M (默认值) 的值
opcache.interned_strings_buffer=64 

;Opcache哈希表可以存储的脚本文件数量上限
;使其尽可能接近(或更多)到您的项目中的脚本数量。选择以下任何值:3907,7963,16229,32531,65407,130987
opcache.max_accelerated_files=32531

;这个配置会在脚本中保留注释
opcache.save_comments=1

;使用快速停止续发事件,快速关机可以提供一个更快的内存清理机制。
opcache.fast_shutdown=1 

管理opcache缓存

开启字节码缓存后,如果要清楚需要手动清除,管理起来是非常麻烦。Laravel框架中提供了一个appstract/laravel-opcache扩展,通过这个扩展可以来管理opcache缓存。

具体如何使用使用appstract/laravel-opcache,可以在github上查看改扩展的具体信息

这里说下扩展可以使用的命令有哪些

Clear OPcache:
php artisan opcache:clear

Show OPcache config:
php artisan opcache:config

Show OPcache status:
php artisan opcache:status

Pre-compile your application code:
php artisan opcache:compile {--force}

注意事项

  • 在安装扩展之前请先关闭opcache扩展,不然扩展安装后不能使用
  • 重启php-fpm服务后,缓存的opcache会被销毁,如果脚本文件需要更新,可以使用上面中的扩展来操作
  • 在本地开发建议关闭缓存opcache.enable=0,不然开发中会遇到很多的问题

思考建议

上面说到了如何使用opcache,但是对opcache的原理,以及如何优化opcache,不出问题,性能稳定。这需要学习C语言,进一步了解PHP底层是如何处理的

推荐阅读

learnku.com/laravel/t/3…

learnku.com/articles/43…

learnku.com/laravel/t/7…