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搞定。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END