每一次执行 PHP 脚本的时候,该脚本都须要被编译成字节码,而 OPcache 能够对该字节码进行缓存,这样,下次请求同一个脚本的时候,该脚本就不须要从新编译,这极大节省了脚本的执行时间,从而让应用运行速度更快,同时也节省了服务器的开销。php
咱们固然很想知道到底进行了怎样的优化,尽管性能提高高度依赖于应用和服务器的配置,不过咱们能够经过运行基准测试(benchmark)有一个大概的了解。laravel
为此我专门准备了一个很低配置的机器:1核CPU,1G内存来运行 Apache 基准测试。我请求的是 Laravel 5.4 默认的欢迎页面,让 10 个并发请求持续访问 1 分钟,如下是关闭 OPcache 的基准测试结果:git
OPcache disabled: 10.18 requests per second
对于一个这么低配置的服务器而言,这也不算太坏,可是咱们能够作得更好。开启 OPcache 的基准测试结果以下(使用默认 OPcache 配置):github
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()
进行确认:app
<?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 服务器,你的应用确定会变得更快。
前面提到,opcache.validate_timestamps
设置为 0
的话咱们须要在每次修改 PHP 代码后手动清除 OPcache。为此我建立了一个扩展包来提供相应的 Artisan 命令处理 OPcache 清理事宜:https://github.com/appstract/laravel-opcache。
安装完扩展后,只需执行以下命令便可清理 OPcache:
php artisan opcache:clear
此外,改扩展包还提供了一些其余有用的工具,你能够在项目的 GitHub页面 上看到。