如何用RoadRunner加速Laravel應用

如何用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__ . &#39;/bootstrap/app.php&#39;; $kernel = $app->make(IlluminateContractsHttpKernel::class); while?($req?=?$psr7-&gt;acceptRequest())?{ ????try?{ ????????$httpFoundationFactory?=?new?HttpFoundationFactory(); ????????if?(strpos($req-&gt;getHeaderLine("content-type"),?"application/json")?===?0)?{ ????????????$body?=?$req-&gt;getBody(); ????????????$parsedBody?=?json_decode($body,?true); ????????????$req?=?$req-&gt;withParsedBody($parsedBody); ????????} ????????$symfonyReq?=?$httpFoundationFactory-&gt;createRequest($req); ????????$request?=?IlluminateHttpRequest::createFromBase($symfonyReq); ????????$response?=?$kernel-&gt;handle($request); ????????$psr7factory?=?new?DiactorosFactory(); ????????$psr7response?=?$psr7factory-&gt;createResponse($response); ????????$psr7-&gt;respond($psr7response); ????}?catch?(Throwable?$e)?{ ????????$psr7-&gt;getWorker()-&gt;error((string)$e); ????} }

運行rr serve -v搞定。

? 版權聲明
THE END
喜歡就支持一下吧
點贊13 分享