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

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.configuration.php#ini.opcache.max-accelerated-files))

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 上面阅读到更多关于它的信息。


Practice makes perfect.

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

译文地址:https://laravel-china.org/topics/7458/op...

本帖已被设为精华帖!
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 6
wujunze

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

11个月前

毫无快的感觉

10个月前

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

10个月前

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

10个月前

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

swoole 常驻内存优势也很大

10个月前

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

Did you mean this?
cache

出这个错,是什么意思?

6个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!