让你的Laravel 应用运行速度飞起来!(利用PHP OPcache)
什么是 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,从 PHP 5.5 开始,OPcache 已经成为 PHP 核心的一部分,所以对于 Laravel 开发者而言,基本上不需要手动去安装这个扩展。
当然,如果不放心,可以通过查看 phpinfo() 进行确认:
<?php phpinfo();
该脚本会显示所有 PHP 安装的扩展。在页面搜索 "OPcache",如果找到,证明已经安装。如果没有,则需要自己去安装。
接下来,我们需要在 PHP 的配置文件中启用 OPcache(默认是关闭的):
opcache.enable=1
下面我们继续对 OPcache 进行一些优化配置:
opcache.memory_consumption=512
这个配置表示你想要分配给 OPcache 的内存空间(单位:MB),设置一个大于 64 的值即可。
opcache.interned_strings_buffer=64
这个配置表示你想要分配给实际字符串的空间(单位:MB),设置一个大于 16 的值即可。
opcache.max_accelerated_files=32531
这个配置表示可以缓存多少个脚本,将这个值尽可能设置为与项目包含的脚本数接近(或更大)。
opcache.validate_timestamps=0
改配置值用于重新验证脚本,如果设置为 0(性能最佳),需要手动在每次 PHP 代码更改后手动清除 OPcache。如果你不想要手动清除,可以将其设置为 1 并通过 opcache.revalidate_freq 配置重新验证间隔,这可能会消耗一些性能,因为需要每隔 x 秒检查更改。
opcache.save_comments=1
这个配置会在脚本中保留注释,我推荐开启该选项,因为一些库依赖于这个配置,并且我也找不出什么关闭它的好处。
opcache.fast_shutdown=0
快速关闭会给一个更快速清理内存的机制,不过,在我的基准测试中,更慢一些,可能这会应用带来一些性能提升,但是你需要自己去尝试。
所以,最终的配置优化长这样:
opcache.enable=1 opcache.memory_consumption=512 opcache.interned_strings_buffer=64 opcache.max_accelerated_files=32531 opcache.validate_timestamps=0 opcache.save_comments=1 opcache.fast_shutdown=0
你可以使用这些配置值进行实验,具体配置值取决于你的应用大小和服务器配置。
最后,保存这个配置文件并重启 Web 服务器,你的应用肯定会变得更快。
准备好 Laravel 应用
前面提到,opcache.validate_timestamps 设置为 0 的话我们需要在每次修改 PHP 代码后手动清除 OPcache。为此我创建了一个扩展包来提供相应的 Artisan 命令处理 OPcache 清理事宜:https://github.com/appstract/laravel-opcache。
安装完扩展后,只需执行如下命令即可清理 OPcache:
php artisan opcache:clear
更多学习内容请访问:
腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)
相关文章
- php://input allow_url_include,php allow_url_include的应用和解释_PHP教程
- PHP服务器在Linux上的应用(php服务器linux)
- PHP与MySQL无缝对接,构建强大数据库应用(php整合mysql)
- MySQL数据库管理应用PHP技术(mysql数据库php)
- PHP在Linux下的应用突破之路(php使用linux)
- Linux搭建PHP网站实现快速上线(linux架设php网站)
- 实现【使用Redis实现PHP抢红包迅速拿奖励】(php抢红包redis)
- 迈出新步伐:Linux下快速PHP升级(linux下php升级)
- Redis实现长连接:PHP开发入门(redis长连接php)
- LINUX下编写PHP程序的技巧(linux编写php)
- 深入理解MySQL转义在PHP中的应用技巧(mysql转义php)
- 使用PHP实现Redis快速构建应用(redis实例php)
- 利用Redis和PHP实现高效数据处理(redis php 使用)
- 测试PHP连接MS SQL 数据库的结果(php链接mssql测试)
- PHP连接MSSQL失败:挫败与失望.(php连接mssql失败)
- 使用PHP扩展开发MSSQL应用(php扩展使用mssql)
- PHP实现MSSQL数据库分页功能(php分页类 mssql)
- PHP与MSSQL的良好配合,助力数据应用升级(php_mssql)
- 使用PHP和MSSQL搭建技术论坛(php mssql 论坛)
- PHP7助力MSSQL,构建更强大应用(php 7支持mssql)
- PHP与MySQL的更新:让Web应用更稳定!(php mysql 更新)
- PHP如何连接MySQL数据库?(php如何连接mysql数据库)
- 利用PHP实现Redis队列任务的并发处理(redis队列任务php)
- PHP应用Redis缓存带来的变化(redis缓存在php)
- 需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
- 一些PHP管理系统程序中的后门
- PHP抽象方法与抽象类abstract关键字介绍及应用
- php格式输出文件var_export函数实例
- PHP图片处理之图片背景、画布操作