• 如何用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搞定。

  • 相关阅读:
    3Sum Closest
    二叉树的下一个结点
    数组中重复的数字
    不用加减乘除做加法
    和为S的连续正数序列
    数组中只出现一次的数字
    求二叉树的是否为平衡二叉树
    由一道很简单的求两条链表的第一个公共节点的问题引发的思考
    第14章 网络编程
    第13章 文档与串行化
  • 原文地址:https://www.cnblogs.com/a609251438/p/12620912.html
Copyright © 2020-2023  润新知