如何用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 Symfony\Bridge\PsrHttpMessage\Factory\DiactorosFactory;

use Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory;

$relay = new Spiral\Goridge\StreamRelay(STDIN,STDOUT);

$psr7 = new Spiral\RoadRunner\PSR7Client(new Spiral\RoadRunner\Worker($relay));

$app = require_once __DIR__ . '/bootstrap/app.php';

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::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 = Illuminate\Http\Request::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搞定。

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


laravel的dd函数不生效怎么办
看不懂laravel文档咋办
安装laravel框架出现command怎么办
Laravel开发API怎么使用事务
laravel怎么构建复杂查询条件
laravel如何实现防止被下载
为什么laravel比yii火
一些常见的Laravel定时任务不运行的问题
laravel用路由有什么好处
composer无法安装laravel怎么办
laravel现在还用吗
laravel怎么替换主键id
laravel的appurl有什么用
如何修改Laravel的报错输出形式
laravel怎么避免foreach查表
laravel怎样操作数据库
laravel怎么截取字符串
laravel 是国内的吗
laravel怎么设置请求头
浅析Laravel社区Redis组件报错的问题和解决方法