打开 PHP OPcache, 让你的 Laravel 应用程序速度飞快

file

什么是 OPcache?

PHP 脚本每次执行的时候,都需要编译成字节码。Opcache 这个扩展是将字节码做缓存,这样重新请求同一脚本的时候,不需要重新编译它。可以节省执行时间,使你的应用程序变得更快(可能节省一些服务器成本)。

用数据说话

当然我们想要知道我们谈论的是哪种优化. 性能的提高很大程度上取决于您的应用程序和服务器配置, 但我们可以快速运行一个 benchmark 来获得我们的想法.

所以我弄了一台 1 CPU and 1 GB RAM 的小型 DO droplet (即 DigitalOcean 服务器 ) 并且运行 Apache Benchmark. 我请求了Laravel 5.4的默认欢迎页面,让 benchmark 运行1分钟,并发连接数为10:

OPcache disabled: 10.18 requests per second

对于这样一个小型服务器来说这还不算坏, 但我们可以做得更好

Enabled with default values: 34.52 requests per second

不同凡响! 让我们看看我们能否进一步加码.

Enabled with optimized values: 42.53 requests per second

信了么?

听起来很棒,我怎么用呢?

在我们做任何事情之前,我建议您先在一台开发/登台机器上测试所有的东西,然后再在一台服务器上进行测试。

首先,我们需要确保在我们的服务器上安装了OPcache。如果您有一个最近的服务器配置,那么OPcache已经安装好了,因为它在不同的提供者之间变得更加常见。如果您使用Laravel Forge,它已经安装并启用了(至少在最近的版本中)。

为了检查是否安装了它,我们可以运行一个简单的PHP脚本:

<?php

phpinfo();

这里展示出你 PHP 安装的所有信息,在这里搜索 OPcache,如果搜到了,确认已经安装。

如果没有安装,在网上搜索安装指导,或者在服务器提供商的论坛/帮助部分搜索安装说明。

现在确保已经安装好了,我们可以调整配置以最大程度地利用它。

> 在 Laravel forge 上选择 *files -> Edit PHP FPM configuration * 在服务器的预览页面打开 PHP 的配置文件
> 在其他服务器,你需要找到加载的 .ini 文件,它就是刚才 phpinfo() 打印出页面的 'Loaded Configuration File'项 。使用你喜爱的编辑器打开。

现在我们看一些可配置的值,我讲一些比较重要的选项。确保他们要放在你配置文件 [opcache] 的下面。

opcache.enable=1

开启. opcache

opcache.memory_consumption=512

你想分配给 .opcache 多少M。根据你的需要选择一个高于 64M (默认值)的值。

opcache.interned_strings_buffer=64

你想分配存储预留字符串的内存多少M. 选择一个高于 16M (默认值) 的值

opcache.max_accelerated_files=32531
OPcache 哈希表中可存储的脚本文件数量上限

有多少个脚本可以被缓存。使其尽可能接近(或更多)到您的项目中的脚本数量。选择以下任何值:3907,7963,16229,32531,65407,130987(请参阅文档以获得解释: (http://php.net/manual/en/opcache.configura...))

opcache.validate_timestamps=0

这将重新验证脚本。如果你把它设置为 0(最好的性能),你需要在每次 PHP 代码改变时手动清除 OPcache(我们将在下一节中处理这个)。如果您不想自己清除它,可以将其设置为 1 ,并使用 opcache.revalidate_freq 配置重新生效时间间隔,这会花费您一些性能,因为它需要每 10 秒检查一次更改。

opcache.save_comments=1

这将保留在你的脚本中的评论,我建议保持启用,因为一些类库依赖它,并且我也没有找到禁用它所带来的的任何好处(除了保存几个字节的RAM)。

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

试下这些设置值, 具体取决于应用程序的大小和服务器的资源. 你可以查看你的使用量和状态通过我的 OPcache 扩展包 (更多内容请参见下一节) 并根据情况更改配置的值.

现在保存该文件并重新启动你的Web服务器. 你的应用程序现在应该更快了!

准备好你的 Laravel App

正如前面提到的,当我们修改 PHP 代码时需要手动清除 OPcache,我构建了一个很便利的包让你使用 artisan 命令去操作 OPcache

按照下面的说明进行安装 repo: github.com/appstract/laravel-opcache
接下来,把该命令添加到部署脚本的结尾处(我将它放在 artisan up 命令的后面)php artisan opcache:clear

该包还包含 OPcache 一些非常有用的工具,你可以在 Github 上面阅读到更多关于它的信息。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://medium.com/appstract/make-your-l...

译文地址:https://learnku.com/laravel/t/7458/open-...

本帖已被设为精华帖!
本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6
hezhizheng

毫无快的感觉

6年前 评论

讲道理来说,如果每次访问都需要把框架加载到内存,而不是常驻内存的话,这个访问速度并不会快多少

6年前 评论

There are no commands defined in the "opcache" namespace.

Did you mean this?
cache

出这个错,是什么意思?

5年前 评论

协同翻译不错啊 人多力量大 ?

6年前 评论

之前用过啊,但是每次修改代码都要清除缓存很麻烦。所以开发时千万别开。。

6年前 评论

@hezhizheng 常驻内存是有绝对的优势,我们目前有node 版本 和 php 版本,node 接口的执行速度比php 快了3-5倍~
https://github.com/notadd/notaddhttps://github.com/notadd/notadd/tree/next

swoole 常驻内存优势也很大

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!