欢迎光临
我们一直在努力

如何用RoadRunner加速Laravel应用

RoadRunner是一个用Go语言实现的高性能PSR-7服务器,你没看错,是Go语言实现的。

RoadRunner首先用Go实现了一个高性能的服务器,然后通过goridge IPC把请求转发给多个PHP CLI Worker,Worker会把请求重新封装成PSR-7 Request交给框架进行处理。

推荐:laravel教程

娱乐测试

使用siege测试Laravel的Welcome页面,250个并发用户,持续30秒,对比Nginx + FPM和RoadRunner。

Nginx + FPM: $ siege --no-parser -c 250 -t 30s http://127.0.0.1:3000/  > /dev/null ** SIEGE 4.0.4 ** Preparing 250 concurrent users for battle. The server is now under siege... Lifting the server siege... Transactions:                   2032 hits Availability:                  97.83 % Elapsed time:                  29.19 secs Data transferred:               4.51 MB Response time:                  2.64 secs Transaction rate:              69.61 trans/sec Throughput:                     0.15 MB/sec Concurrency:                  183.50 Successful transactions:        2032 Failed transactions:              45 Longest transaction:           27.34 Shortest transaction:           0.

RoadRunner(4 worker):

$ siege --no-parser -c 250 -t 30s http://127.0.0.1:8080/  > /dev/null ** SIEGE 4.0.4 ** Preparing 250 concurrent users for battle. The server is now under siege... Lifting the server siege... Transactions:                  61417 hits Availability:                 100.00 % Elapsed time:                  29.26 secs Data transferred:             135.95 MB Response time:                  0.12 secs Transaction rate:            2099.01 trans/sec Throughput:                     4.65 MB/sec Concurrency:                  249.06 Successful transactions:       61417 Failed transactions:               0 Longest transaction:            0.20 Shortest transaction:           0.05

如何加速Laravel应用

RoadRunner安装

RoadRunner已经提供了预编译的执行文件,下载对应平台的版本即可,配置文件可用RoadRunner提供的:Using RoadRunner.

Laravel配置

安装依赖:

composer require spiral/roadrunner zendframework/zend-diactoros symfony/psr-http-message-bridge

在Laravel项目创建一个psr-worker.php,代码修改来自tobias-kuendig:

<?php require __DIR__ . "/vendor/autoload.php"; use SymfonyBridgePsrHttpMessageFactoryDiactorosFactory; use SymfonyBridgePsrHttpMessageFactoryHttpFoundationFactory; $relay = new SpiralGoridgeStreamRelay(STDIN, STDOUT); $psr7 = new SpiralRoadRunnerPSR7Client(new SpiralRoadRunnerWorker($relay)); $app = require_once __DIR__ . '/bootstrap/app.php'; $kernel = $app->make(IlluminateContractsHttpKernel::class); while ($req = $psr7->acceptRequest()) {     try {         $httpFoundationFactory = new HttpFoundationFactory();         if (strpos($req->getHeaderLine("content-type"), "application/json") === 0) {             $body = $req->getBody();             $parsedBody = json_decode($body, true);             $req = $req->withParsedBody($parsedBody);         }         $symfonyReq = $httpFoundationFactory->createRequest($req);         $request = IlluminateHttpRequest::createFromBase($symfonyReq);         $response = $kernel->handle($request);         $psr7factory = new DiactorosFactory();         $psr7response = $psr7factory->createResponse($response);         $psr7->respond($psr7response);     } catch (Throwable $e) {         $psr7->getWorker()->error((string)$e);     } }

运行rr serve -v搞定。

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。