让子弹飞~利用 OPcache 扩展提升 PHP7 性能 | Laravel 篇

No matter where I am, I will reply you immediately when I see the email.My Email: echo "YUBzYW1lZ28uY29tCg==" | base64 -d
前言
十一点半了,沉淀时间到了。

PHP在运行的时候,存在这样的一个流程,先将PHP代码预编译,生成字节码后再加载到内存里,最后CPU在内存上执行编译后的字节码片段。我们会发现,在执行PHP程序的时候,每次都经过这样的流程,此非浪费Time,是的,很容易联想到:为何不向C++语言看齐呢,将源码编译成可直接加载到内存so哥呢?呃呃?。快拿出你的步枪,装上这颗子弹OPcache。自从PHP5.5.0出来后,就内置此zend扩展了。


What is OPcache
OPcache是PHP中的Zend扩展,可以大大提升PHP的性能。
OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。


Judge whether it has been extended OPcache

➜  ~ php -m | grep OPcache
Zend OPcache
Zend OPcache

倘若没有开启的话,可以在php.ini配置中开启
/home/samego/service/php7.2/php.ini

➜  ~ echo zend_extension="opcache.so" >> /home/samego/service/php7.2/php.ini

About OPcache configure
接下来,我们需要在 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

你可以使用这些配置值进行实验,具体配置值取决于你的应用大小和服务器配置。
学习于Laravel社区


Laravel OPcache

  • install

    ➜  ~ composer require appstract/laravel-opcache
  • configure

    ➜  ~ php artisan vendor:publish --provider="Appstract\Opcache\OpcacheServiceProvider" --tag="config"
  • command

# Clear OPcache:
➜  ~ php artisan opcache:clear

# Show OPcache config:
➜  ~ php artisan opcache:config

# Show OPcache status:
➜  ~ php artisan opcache:status

# Pre-compile your application code:
➜  ~ php artisan opcache:optimize

拭目以待的场景测试

个人比较喜欢数据说话
场景:(1)请求GET接口 (2)测试次数10 (3)并发数为100

case non-extension

1000个请求,花费32.32秒,每秒30.94个请求

Transactions:               1000 hits
Availability:             100.00 %
Elapsed time:              32.32 secs
Data transferred:           0.97 MB
Response time:              0.32 secs
Transaction rate:          30.94 trans/sec
Throughput:             0.03 MB/sec
Concurrency:                9.96
Successful transactions:        1000
Failed transactions:               0
Longest transaction:            0.44
Shortest transaction:           0.11

case had extend

1000个请求,花费2.94秒,每秒340.14个请求

Transactions:               1000 hits
Availability:             100.00 %
Elapsed time:               2.94 secs
Data transferred:           0.97 MB
Response time:              0.03 secs
Transaction rate:         340.14 trans/sec
Throughput:             0.33 MB/sec
Concurrency:                9.86
Successful transactions:        1000
Failed transactions:               0
Longest transaction:            0.29
Shortest transaction:           0.01

看到这组数据,我甚是高兴,无比的喜悦。在性能方面,形成如此鲜明的对比,我二话不说~OPcache is right
(¦3[▓▓] 晚安
价值源于技术,技术源于分享!

本作品采用《CC 协议》,转载必须注明作者和本文链接
价值源于技术,贡献源于分享 | 笔记分享归档 No matter where I am, I will reply you immediately when I see the email. My Email: echo "YUBzYW1lZ28uY29tCg==" | base64 -d 个人比较喜欢分享,若有不对的地方非常感谢指出 相互学习、共同进步~
本帖由系统于 5年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 16

@samor 你的问题,可以使用下面的命令。

的确很靠谱,缺点就是每次更新代码都要注意,先清缓存,再整体执行优化,命令:

php artisan opcache:clear && php artisan opcache:optimize
5年前 评论
刘天承

吊的一炸天

5年前 评论

缓存的默认时间是180秒
opcache.force_restart_timeout (default "180")
同一个变量在180内修改的话还是之前的值
这个怎么解决!
修改秒数吗?

5年前 评论

@samor 你的问题,可以使用下面的命令。

的确很靠谱,缺点就是每次更新代码都要注意,先清缓存,再整体执行优化,命令:

php artisan opcache:clear && php artisan opcache:optimize
5年前 评论

@扣丁禅师 测试用什么可以实现?

5年前 评论
jltxwesley

其实学习的部分 原版不是那个 Laravel 学院的 而是从 Medium 翻译过来的:https://medium.com/appstract/make-your-lar...

5年前 评论

@AlicFeng 非常感谢

5年前 评论
RockyHuas

运行以上命令会报错, 通过排查发现,该 laravel-opcachel 包有个小 BUG

file

调整前:

file

调整后:

file

5年前 评论

@AlicFeng
docker下php容器里运行一直提示路由404怎么破?无论换哪个地址都不行.
试了nginx镜像的地址、服务器的公网ip、内网ip。

5年前 评论

@Triant 先看下容器status,再看下端口有没有问题,这两项没有问题的话,那就是nginx或者php-fpm配置问题了

5年前 评论

@AlicFeng nginx和php容器的status都正常,nginx容器开放80端口,php容器开放9000,web服务正常,宿主机上curl opcache-api也提示404。opcache扩展已安装,实际也已经生效,就差这个包来管理。

5年前 评论

@AlicFeng 抱歉,学艺不精的我找到问题了,是我自己构建的容器的问题,没搞清楚容器的运行逻辑,容器在启动的那一刻就已经进行opcache缓存生成操作, 此时进入容器compsoer install/update完成后,必需重启php容器(强制刷新),然后再进入容器运行opcache:status即可看到最新的缓存信息。
由此引出第二个可能是我学艺不精导致的问题:为啥我在容器里执行opcache_reset()返回false...

5年前 评论

请问一下,按着文章配置了,但是仍然看不出提升效果。是哪个地方有问题吗

file

file

file

4年前 评论

@will_lin 好吧没事了,原来是我服务器配置的问题。1核1g只能达到你优化前的。。

4年前 评论

php artisan opcache:optimize

Optimize started, this can take a while... The requested URL returned error: 500 Internal Server Error Url: 127.0.0.1/opcache-api/optimize?key=...

这是什么原因

3周前 评论

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