有人说PHP性能低?go语言性能高?到底谁高谁低数据说话!我们就来实际对比一下各PHP框架及一款go语言框架的性能是怎样的。
硬件: CPU:Intel(R) Xeon(R) CPU E5-2689 0 @ 2.60GHz 16核心。内存:16GB。
操作系统:Ubuntu 18.04
PHP版本:7.4
压力测试命令: ab -n 100000 -c 1000 -k $url
PHP框架最新输出hello world压力测试结果:
框架 | 版本 | 方式 | web服务器 | RPS | 最高日/PV |
laravel | 8.x | web | nginx | 1000 | 8640w |
symfony | 4.4 | web | nginx | 2300 | 1.98亿 |
symfony | 4.4 | api | nginx | 4800 | 4.14亿 |
CI | 4.0 | web | nginx | 4800 | 4.14亿 |
thinkphp | 6.0 | web | nginx | 2400 | 2.0亿 |
lumen | 7.2 | api | nginx | 5500 | 4.75亿 |
ubiquity | 2.3 | web | nginx | 6400 | 5.52亿 |
phalcon | 3.4.4 | nginx | |||
webman | 1.0 | web | php-cli | 30000 | 25.9亿 |
mixphp | 2.2 | web | php-cli | 44000 | 38亿 |
go-zero | 1.1.1 | api | go语言 | 25000 | 21.6亿 |
*mixphp为基于swoole 4.5的框架,开启多核与端口复用(并不是核心越多性能越高,以上开了4核)
PHP框架最新模板渲染输出hello world压力测试结果:
框架 | 版本 | 方式 | web服务器 | RPS | 最高日/PV |
laravel | 8.x | web | nginx | 1000 | 8640w |
symfony | 4.4 | web | nginx | 2200 | 1.9亿 |
CI | 4.0 | web | nginx | 4700 | 4亿 |
thinkphp | 6.0 | web | nginx | 2300 | 1.98亿 |
lumen | 7.2 | api | nginx | 4600 | 3.9亿 |
ubiquity | 2.3 | web | nginx | 6400 | 5.52亿 |
phalcon | 3.4.4 | nginx | |||
webman | 1.0 | web | php-cli | 31000 | 26.7亿 |
mixphp | 2.2 | web | php-cli | 25000 | 21.6亿 |
PHP框架最新读取mysql 5.7数据库压力测试结果:
框架 | 版本 | 方式 | web服务器 | RPS | 最高日/PV | 说明 |
laravel | 8.x | web | nginx | 700 | 6048w | DB::table()->get() |
symfony | 4.4 | web | nginx | 1300 | 1.1亿 | |
symfony | 5.2 | api | nginx | 1900 | 1.64亿 | |
CI | 4.0 | web | nginx | 2900 | 2.5亿 | |
thinkphp | 6.0 | web | nginx | 1500 | 1.29亿 | |
lumen | 7.2 | api | nginx | 2500 | 2.16亿 | |
ubiquity | 2.3 | web | nginx | 5600 | 4.8亿 | |
phalcon | 3.4.4 | nginx | ||||
webman | 1.0 | web | php-cli | 31000 | 26.7亿 | |
mixphp | 2.2 | web | php-cli | 25000 | 21.6亿 |
*从mysql数据库的用户表,读取约10个用户名后,循环输出(不经过模板渲染)。
*ubiquity:如果用了php7.4 preloading 有性能高达50-60%的性能提升.
*laravel 8.x 优化后测试达到1200RPS。
附图:
说明:
0.以上各框架都为下载框架后,按各框架默认安装方式安装好,同时关闭debug模式,无其它性能优化情况下进行测试,同时关闭nginx的 access log。
1.为了测试准确,laravel 的SESSION_DRIVER不要设置为file,这里设置为array,否则会由于大量磁盘IO会造成结果比较低。
2.Mysql的连接数要设置足够大,不然会出错完不成压力测试。
3.如果由于高并发出现php-fpm错误:connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporarily unavailable),请修改参数:
1)内核修改
sudo vim /etc/sysctl.conf
net.ipv4.tcp_max_syn_backlog = 4096
net.core.netdev_max_backlog = 4096
sudo sysctl -p生效
2)php-fpm配置修改
修改 /etc/php/7.4/fpm/pool.d/www.conf
listen.backlog = 4096
sudo service php-fpm7.4 restart
4.日最高PV,为RPSx86400(一天的秒数),为可能达到的日最高页面浏览量.当然由于网民一般在夜里的浏览量比较低,实际的PV,是小于这个数的,根据百度统计的用户上网时间分布,得出的实际PV应该是日最高PVx0.72,当然百度统计是全网网站的平均值,根据网站类型不同,有些网站的实际日PV可能是日最高PV/2或日最高PV/3。
5.此测试结果保证严谨,此压力测试前前后后大约一年内时间经历了好几轮测试,此为2021最新版本结果。每个框架的结果误差大约在100以内。
2021.2.18更新:因为ap工具只支持http/1.0,不支持http/1.1,所以 如果响应头中有Transfer-Encoding: chunked 的,则ab不会启用keep-alive 连接,所以会造成测试数据比较低。如上图中的,没有keep-alilve数据的,可能不准确。而用Content-Length头,则可以以keep-alive连接。可以换为wrk测试工具进行测试。待以后数据更新。
结论:
go的框架没有比过php框架。
ubiquity:(https://ubiquity.kobject.net/) ,做为一个纯PHP框架,目前是传统PHP框架中性能最高的。
webman(https://www.workerman.net/doc/webman),mixphp(swoole)框架为cli模式,因为是长驻内存,所以性能最高,并在hello world测试中超过了go语言的go-zero框架。
如果你用的是laravel技术栈,那么在做接口时,强烈建议用laravel的微框架lumen,除具有非常高的性能外,还具有laravel的大部分功能,并且可以极容易升级到laravel框架。
ps:https://github.com/lizhichao/one (此框架性能也很高。)
最后更新时间:2021.01.26
原创文章,转载请注明:来自Lenix的博客,地址https://blog.p2hp.com/archives/6906
最后更新于 2021年2月18日