测试用 Octane 加速 Laravel10,并发达到4倍左右,同时对比Hyperf3压力测试
Laravel
开发爽,但性能完全无法忍受。刚完成一个项目,有点时间,试试看用 octane
加持后是否能摆脱 Laravel
的性能魔咒。Laravel
应用基本可可无缝迁移到 Hyperf
,因此同时测试 Hyperf
,看看 Swoole
协程异步加持的 Hyperf
是不是比 Laravel
快很多。
测试环境
1 | 服务器: 阿里轻量云服务器 |
Laravel 压测
1 | # 创建 Demo 模型、迁移、控制器 |
demos
表迁移结构:
1 | Schema::create('demos', function (Blueprint $table) { |
Demo
模型类:
1 | namespace App\Models; |
DemoController
控制器类:
1 | namespace App\Http\Controllers; |
php artisan route:list
查看路由:
1 | GET|HEAD db-query ........................ DemoController@dbQuery |
Laravel 默认启用了文件存储的 Session,每次压测前先删除 session 文件,否则 session 文件多了影响性能。
换成 redis 存储 session 可不用每次压测前删除 session,对测试结果影响不大。
- 启动 Laravel web 命令:
php artisan serve
- 启动 Laravel octane 命令:
php artisan octane:start
应使用类似 production 环境,才能获得有意义压测的数据,因此应做一定的优化再测试。
Laravel 性能优化设置:
- PHP 启用 opcache,并且 cli 也启用 opcache(命令行没有开启 opcache 时,速度极慢,Laravel 只有 8~10请求/秒)
- composer install –optimize-autoloader –no-dev
- php artisan route:cache
- php artisan config:cache
- .evn 设置
- APP_DEBUG=false
- LOG_LEVEL=error
Laravel 压测结果
1 | wrk -c100 -t50 http://localhost:8000/hello |
Laravel Octane 加速压测结果
1 | wrk -c100 -t50 http://localhost:8000/hello |
Hyperf 压测
创建表迁移、模型、控制器命令:
1 | php bin/hyperf.php gen:migration create_demos_table |
demos 表迁移结构:
1 | Schema::create('demos', function (Blueprint $table) { |
Hyperf Demo
模型类:
1 | namespace App\Model; |
Hyperf DemoController
控制器类:
1 | namespace App\Controller; |
php bin/hyperf.php describe:routes
查看路由表:
1 | +--------+---------------+---------------+----------------------------------------+------------+ |
压力测试结果
压力测试应模拟 production 环境才能得到有效的数据
- 日志级别设为 ERROR
- 执行 composer install –no-dev
- 用 redis 存 cookie
启用 session 后压测
Laravel 默认启用 session,实际项目也经常用到 session,因此特开启 session 来测试,以对比数据。
1 | wrk -c100 -t50 http://localhost:9501/demo/hello |
没有启用 session
1 | wrk -c100 -t50 http://localhost:9501/demo/hello |
数据对比(每秒处理次数)
- | Laravel | Laravel + Octane | Hyperf 启用 session | Hyperf 不启用 session |
---|---|---|---|---|
返回简单字符串 | 120 | 560 | 4700 | 21000 |
MySQL 表写入 | 70 | 230 | 1000 | 1500 |
MySQL 单条读取(WHERE id = 1) | 80 | 380 | 1700 | 2600 |
MySQL 范围查询(WHERE id > 100 LIMIT 10) | 75 | 300 | 980 | 1200 |
总结
- Laravel 生产环境优化后速度基本能接受。
- Laravel 10 使用 Octane (Swoole) 加速,性能提升4倍左右;
- Hyperf3 如果不需要连接其他服务(如redis、MySQL)速度非常快。
- Hyperf3 用上 MySQL 后被拖后腿,速度是 Laravel Octane 加速后的 4倍左右。
现在你完全不必担心 Laravel 10
的性能问题,性能达到瓶颈时可用 Octane
加速,并发很高的部分可以迁移到 Hyperf。
测试用 Octane 加速 Laravel10,并发达到4倍左右,同时对比Hyperf3压力测试
https://coderpan.com/php/hyperf-laravel-performant-test.html