| 导语开启opcache提升PHP性能
OPcache通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。 PHP 5.5.0 及后续版本中已经绑定了 OPcache 扩展。 对于 PHP 5.2,5.3 和 5.4 版本可以使用 PECL 扩展中的 OPcache 库。
opcahe这个扩展不是默认开启的,很容易被大家遗忘,如果你想继续提升你PHP系统的性能,在实践代码优化,分布式,轻重分离,缓存等等之后,恰好又忘记了开启opcahe,那么恭喜你,它一定会给你惊喜的。
或者你还什么都没做,想快速提升系统性能,那就更合适了
如果你使用的就是PHP7,并且在编译的时候就开启了opcache --enable-opcache 可以通过phpinfo查看,后面所需要用到的各种路径也可以通过phpinfo来查看,比果你不知道你的PHP安装目录,配置文件所在的目录。
那你可以直接转到第三步开启opcache,如果没有则需要通过源码进行编译,过程也很简单
0.先找到你安装的php的源码(留着源码还是很重要的,PHP的官方扩展都在里面),如果源码找不到了也可以通过php -v来获取版本号去官网下载
[root@centos7 opcache]# php -v
PHP 7.2.1 (cli) (built: Feb 9 2018 11:49:02) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies
[root@centos7 opcache]# pwd
/data/src/lnmp1.3-full/src/php-7.2.1/ext/opcache
[root@centos7 opcache]#
1.使用phpize生成configure文件,为编译做准备,这里的phpize在你安装好的php的目录下,如/usr/local/php/bin/phpize
[root@centos7 opcache]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20170718
Zend Module Api No: 20170718
Zend Extension Api No: 320170718
2.生成makefile ./configure --with-php-config=/usr/local/php/bin/php-config 这个参数很重要,如果你的php不是安装到默认位置,这里就得指定php-config所在的位置
3.直接make && make install,几秒钟之后编译好的so就会出现在php的扩展目录中
[root@centos7 opcache]# cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/
[root@centos7 no-debug-non-zts-20170718]# ll
总用量 11556
-rwxr-xr-x 1 root root 3552344 2月 9 2018 opcache.a
-rwxr-xr-x 1 root root 1955840 2月 9 2018 opcache.so
-rwxr-xr-x 1 root root 1812360 3月 8 16:27 redis.so
-rwxr-xr-x 1 root root 4502352 3月 8 11:01 swoole.so
如果看到opcache.so那就恭喜你,编译完成了
4.修改php.ini,这个在/usr/local/php/,如果没有指定安装目录则在/etc目录下,通过修改配置文件开启opcache功能,修改完配置文件后需要重启
1.nginx+php-fpm的形式只需要重启php-fpm即可
2.apache的模式下需要重启apache
[Zend Opcache]
#加载编译好的so
zend_extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/opcache.so
opcache.memory_consumption=64 #为opcache分配多少共享内存,单位M
opcache.interned_strings_buffer=8 #nterned string的内存大小
opcache.max_accelerated_files=4000 #最大缓存的文件数目。 实际上这个值会使用第一个大于你配置的数字的下列素数 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 }, 如你将该值指定为400,则实际上该值为463.
opcache.force_restart_timeout=180 #如果opcache处于非active状态,当N秒后opcache将自动重启
opcache.revalidate_freq=60 #opcache自动检测文件是否更新的周期,单位秒。 如果是0,则每次请求时opcache都要进行检测。 当validate_timestamps为0时,本指令无效。
opcache.fast_shutdown=1 #是否打开快速关闭, 打开时可使php在request shutdown时回收内存快
opcache.enable_cli=1 #是否在CLI(即命令行时)启用opcache
这里只罗列了常用的部分参数,所有参数提供一个链接,有兴趣的可以研究一下https://blog.csdn.net/bly1126/article/details/19077853
重启完之后可以通过php-fpm -m 或者php -m 来查看是否加载成功
[Zend Modules]
Zend OPcache
到此为止你的PHP就开启强大的opcache功能,就PHP7而已,一般性能能达到5-10倍的提升
这里简单介绍下配合,腾讯云1C1G CVM 数据库mysql5.5.56本机安装,PHP7.2.1,wordpress4.9.8,使用ab压测,参数 ab -c 10 -n 100 https 跑wordpress首页
开启之前
Server Software: nginx
Server Hostname: 马赛克
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128
Document Path: /
Document Length: 53027 bytes
Concurrency Level: 100
Time taken for tests: 9.358 seconds
Complete requests: 25
Failed requests: 0
Write errors: 0
Total transferred: 1331800 bytes
HTML transferred: 1325675 bytes
Requests per second: 2.67 [#/sec] (mean)
Time per request: 37431.768 [ms] (mean)
Time per request: 374.318 [ms] (mean, across all concurrent requests)
Transfer rate: 138.98 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 156 192 7.7 194 196
Processing: 1255 4178 618.8 4279 4592
Waiting: 1194 4115 618.2 4216 4526
Total: 1411 4370 626.2 4474 4784
开启之后
Server Software: nginx
Server Hostname: 马赛克
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128
Document Path: /
Document Length: 53027 bytes
Concurrency Level: 100
Time taken for tests: 26.933 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 53272000 bytes
HTML transferred: 53027000 bytes
Requests per second: 37.13 [#/sec] (mean)
Time per request: 2693.324 [ms] (mean)
Time per request: 26.933 [ms] (mean, across all concurrent requests)
Transfer rate: 1931.57 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 111 145 39.6 134 293
Processing: 151 2427 402.0 2414 3418
Waiting: 73 2360 401.1 2344 3358
Total: 277 2573 390.1 2549 3658
性能提升还是很显著。和在网上收集的信息基本一致(请忽略这很挫的数据,本来配置就不高,而且数据库等等都装在一起,空跑hello world 1000qps也没什么意思),其实,按照opcache的原理来看,越是复杂的代码性能提升越是明显,从实验结果也验证了这个原理
Server Software: nginx
Server Hostname: 马赛克
Server Port: 80
Document Path: /test.php
Document Length: 12 bytes
Concurrency Level: 100
Time taken for tests: 0.895 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 190000 bytes
HTML transferred: 12000 bytes
Requests per second: 1117.90 [#/sec] (mean)
Time per request: 89.454 [ms] (mean)
Time per request: 0.895 [ms] (mean, across all concurrent requests)
Transfer rate: 207.42 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 35 38 1.7 37 44
Processing: 36 41 4.7 40 58
Waiting: 36 41 4.7 39 58
Total: 71 79 5.5 77 98
PHP作为一个解释语言,相比编译型语言运行效率确实是一个短板,但是开启opcache可以减小这一差距,而且不需要程序员做任何代码的修改,可以说是零成本,高收益,推荐在生产环境保持开启,来提升系统的性能。当然如果是在本地开发的时候建议关闭,因为会造成修改完的代码不会马上生效,造成在开发时的不必要的麻烦。
PHP的优势在于学习门槛低,开发效率高,况且PHP7作为最新版本的,已经显著提升了性能,在项目的初期优势非常明显,等度过了初期的后续是继续优化PHP架构,还是换成运行更快的语言如Go就看各位具体项目的情况了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。