用RoadRunner加速Laravel应用
Posted php中文网最新课程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用RoadRunner加速Laravel应用相关的知识,希望对你有一定的参考价值。
php中文网最新课程
每日17点准时技术干货分享
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:
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搞定。
▼请点击下方:“阅读原文”,在线查看全部文章内容!
以上是关于用RoadRunner加速Laravel应用的主要内容,如果未能解决你的问题,请参考以下文章