通过 PHP OPcache 让你的 Laravel 应用运行速度飞起来

参考:http://www.phpmianshi.com/?id=79

Laravel 优化介绍:

https://segmentfault.com/a/1190000011569012

1.缓存配置信息 php artisan config:cache

2.缓存路由信息 php artisan router:cache

3.类映射加载优化 php artisan optimize

4.自动加载优化 composer dumpautoload

什么是 Opcache

每一次执行 PHP 脚本的时候,该脚本都需要被编译成字节码,而 OPcache 可以对该字节码进行缓存,这样,下次请求同一个脚本的时候,该脚本就不需要重新编译,这极大节省了脚本的执行时间,从而让应用运行速度更快,同时也节省了服务器的开销。

用数字说话

我们当然很想知道到底进行了怎样的优化,尽管性能提升高度依赖于应用和服务器的配置,不过我们可以通过运行基准测试(benchmark)有一个大概的了解。

为此我专门准备了一个很低配置的机器:1核CPU,1G内存来运行 Apache 基准测试。我请求的是 Laravel 5.4 默认的欢迎页面,让 10 个并发请求持续访问 1 分钟,以下是关闭 OPcache 的基准测试结果:

OPcache disabled: 10.18 requests per second

对于一个这么低配置的服务器而言,这也不算太坏,但是我们可以做得更好。开启 OPcache 的基准测试结果如下(使用默认 OPcache 配置):

Enabled with default values: 34.52 requests per second

差距还是很大的!我们接下来对 OPcache 配置进行优化,基准测试的表现效果更好:

Enabled with optimized values: 42.53 requests per second

这把服了没有?

听起来很牛逼,不过怎么使用呢

首先,我们需要确保在服务器上安装了 OPcache。

当然,如果不放心,可以通过查看 phpinfo() 进行确认 如果没有,则需要自己去安装。

接下来,我们需要在 PHP 的配置文件中启用 OPcache(默认是关闭的):

opcache.enable=1

下面我们继续对 OPcache 进行一些优化配置:

opcache.memory_consumption=512

这个配置表示你想要分配给 OPcache 的内存空间(单位:MB),设置一个大于 64 的值即可。

opcache.interned_strings_buffer=64

这个配置表示你想要分配给实际字符串的空间(单位:MB),设置一个大于 16 的值即可。

opcache.max_accelerated_files=10000

这个配置表示可以缓存多少个脚本,将这个值尽可能设置为与项目包含的脚本数接近(或更大)。

opcache.validate_timestamps=0

如果设置为 0(性能最佳),需要手动在每次 PHP 代码更改后手动清除 OPcache。如果你不想要手动清除,可以将其设置为 1 并通过 opcache.revalidate_freq 配置重新验证间隔,这可能会消耗一些性能,因为需要每隔 x 秒检查更改(默认1)。

opcache.save_comments=1

这个配置会在脚本中保留注释,我推荐开启该选项,因为一些库依赖于这个配置,并且我也找不出什么关闭它的好处。

opcache.fast_shutdown=0

快速关闭会给一个更快速清理内存的机制,不过,在我的基准测试中,更慢一些,可能这会应用带来一些性能提升,但是你需要自己去尝试。

所以,最终的配置优化长这样:

opcache.enable=1 opcache.memory_consumption=512 opcache.interned_strings_buffer=64 opcache.max_accelerated_files=10000 //最大加速文件数,linux下可以通过find . -type f -print | grep php | wc -l命令查看项目有的文件数,该值应该大于项目下的文件数 opcache.validate_timestamps=0 opcache.save_comments=1 opcache.fast_shutdown=0

 

手动清理缓存

除了重启php-fpm的进程可以清理opcache缓存外,

需要注意的是,当PHP以PHP-FPM的方式运行的时候,opcache的缓存是无法通过php命令 opcache_reset()进行清除的,只能通过http或cgi到php-fpm进程的方式来清除缓存。

总结

如果代码发布是全量发布,切换软链接的方式,可以设置opcache.validate_timestamps=1和opcache.revalidate_freq=1来定时自动更新缓存。

如果代码发布是覆盖更新旧目录,则可以重启php-fpm及在脚本中或代码文件中使用opcache_reset函数来清理所有缓存。

如果可以获取到更新的代码文件列表,则可以使用opcache_invalidate函数来清理代码,同时也可以避免影响到其他业务的缓存。

准备好 Laravel 应用

前面提到,opcache.validate_timestamps 设置为 0 的话我们需要在每次修改 PHP 代码后手动清除 OPcache。为此我创建了一个扩展包来提供相应的 Artisan 命令处理 OPcache 清理事宜:https://github.com/appstract/laravel-opcache

安装完扩展后,只需执行如下命令即可清理 OPcache:

php artisan opcache:clear

此外,改扩展包还提供了一些其他有用的工具,你可以在项目的 GitHub页面 上看到。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值