[转载]使用workerman加速任意项目

众所周知,workerman是基于php cli的,由于php cli模式下无法使用php自带的header、sesion、cookie等函数,这导致将传统的php项目无法直接在workerman容器下直接运行。

我一度以为让传统业务在workerman中运行,就必须更改框架甚至业务代码以适配workerman,直到joanhey发了一个issue,打破了我的认知。

他们发布了一个名叫AdapterMan的项目,它可以做到不更改传统框架代码的情况下让你的传统php项目放到workerman中正常运行,并且他们公司已经在生产环境用了2年。

注意,是零代码改动直接让laravel、lumen、Slim等框架的项目在workerman上运行。

目前他们已经在laravel、lumen、Slim、Symfony、CakePHP、Yii2、KumbiaPHP 等做了初步压力测试,性能有很大的提升。

以下是压测结果

Laravel 8

Fw Plaintext Json Single query Multiple query Updates Fortunes
Laravel 14,799 14,770 9,263 3,247 1,452 8,354
Laravel Roadrunner 482 478 474 375 359 472
Laravel Swoole 38,824 37,439 21,687 3,958 1,588 16,035
Laravel Laravel s 54,617 49,372 23,677 2,917 1,255 16,696
Laravel Workerman 103,004 99,891 46,001 5,828 1,666 27,158
Laravel with Workerman % gain 596.02% 576.31% 396.61% 79.489% 14.738% 225.09%

使用workerman加速任意项目[置顶]

Symfony 6

使用workerman加速任意项目[置顶]

Fw Plaintext Json Single query Multiple query Updates Fortunes
Symfony 38,231 37,557 12,578 10,741 3,420 10,741
Symfony Workerman 210,796 197,059 107,050 13,401 4,062 71,092

Lumen 9

Fw Plaintext Json Single query Multiple query Updates Fortunes
Lumen 18,998 18,616 10,791 3,496 1,461 9,223
Lumen Swoole 44,861 43,598 24,255 4,178 1,599 16,854
Lumen Laravel s 93,335 82,745 31,567 3,030 1,282 21,130
Lumen Workerman 185,126 177,667 58,729 5,857 1,662 31,430

Slim with Workerman

Without ORM

Framework JSON 1-query 20-query Fortunes Updates Plaintext
Slim 4 38,305 34,272 12,579 32,634 2,097 35,251
Slim 4 Workerman 129,393 81,889 15,803 73,212 2,456 134,531
Slim 4 Workerman pgsql * 102,926 19,637 92,752 14,875

Lumen v9

使用workerman加速任意项目[置顶]
接入代码类似

<?php
require_once __DIR__ . '/vendor/autoload.php';

use Adapterman\Adapterman;
use Workerman\Worker;

Adapterman::init();

$http_worker                = new Worker('http://0.0.0.0:8080');
$http_worker->count         = 8;
$http_worker->name          = 'AdapterMan';

$http_worker->onWorkerStart = static function () {
    //init();
    require __DIR__.'/start.php';
};

$http_worker->onMessage = static function ($connection, $request) {
    $connection->send(run());
};

Worker::runAll();

项目地址:
github.com/joanhey/AdapterMan 强烈建议大家为其点赞(点星星)
相关链接:
github.com/walkor/workerman/issues...

原文链接:www.workerman.net/q/9831

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 17
JaguarJack

就只有两个文件吗?Laravel 的单例应该会有问题 :joy:

1年前 评论
Leesinyii 1年前

零代码改动,要是没问题的话,那是真厉害

1年前 评论

会有内存泄漏吧

1年前 评论
Leesinyii 1年前

laravel的静态方法就会炸的吧

1年前 评论
fatrbaby

看了看,原理很简单。但我们就是想不到 :joy:

1年前 评论
黑将军

可能只适合前后端分离项目,我试了一下传统模板渲染项目,样式、js全都挂

1年前 评论
mouyong 1年前
黑将军 (作者) 1年前

我用到tp了 还是挺快的

1年前 评论
goStruct

看了下代码思路很独特,禁用掉相关的函数,再自己去实现替换掉禁用的函数。

1年前 评论

请问有试过静态方法吗

1年前 评论

刚刚在大佬的推荐下看过,在这里就看到了

1年前 评论

有没有大佬简单讲解一下,为什么cli下,单例模式会有问题

1年前 评论
Leesinyii 1年前

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