如何用RoadRunner加速Laravel应用

Posted Raylove

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用RoadRunner加速Laravel应用相关的知识,希望对你有一定的参考价值。

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

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

娱乐测试

使用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搞定。

 

以上是关于如何用RoadRunner加速Laravel应用的主要内容,如果未能解决你的问题,请参考以下文章

尝试将 laravel lighthouse-php 与 Roadrunner Server 一起使用时遇到间歇性错误

如何用Alluxio加速云上深度学习训练?

如何用Alluxio加速云上深度学习训练?

如何用sockscap64加速游戏

如何用matlab求解微分方程组的数值解

如何用陀螺仪测加速度