hunternnm/laravel-roadrunner

高性能PHP应用服务器RoadRunner的桥梁

2.0.8 2020-05-21 13:21 UTC

This package is auto-updated.

Last update: 2024-09-06 01:58:21 UTC


README

简单的Laravel-Roadrunner桥梁

安装

$ composer require hunternnm/laravel-roadrunner

如果需要,请发布配置文件以更改实现(例如,重置器和更多)

php artisan vendor:publish --provider="Hunternnm\LaravelRoadrunner\RoadrunnerServiceProvider" --tag=config

使用方法

该包已准备好用于生产,并包含一个简单的psr-worker(bin/roadrunner-worker),可以从头开始运行。如果您需要自定义工作进程,请参阅示例

示例

运行Laravel的示例.rr.yaml

http:
  address: 0.0.0.0:8000
  workers:
    command: "php vendor/bin/roadrunner-worker"
    pool:
      numWorkers: 16
      destroyTimeout: 3
      maxJobs:  0
rpc:
  enable: true
  listen: tcp://:6001

然后运行roadrunner ./rr -w PATH_TO_YOUR_PROJECT

自定义psr-worker.php

<?php

use Hunternnm\LaravelRoadrunner\RoadrunnerLaravelBridge;
use Illuminate\Foundation\Application;
use Illuminate\Http\Request;
use Spiral\Goridge;
use Spiral\RoadRunner;
use Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory;
use Symfony\Bridge\PsrHttpMessage\Factory\PsrHttpFactory;
use Laminas\Diactoros\ResponseFactory;
use Laminas\Diactoros\ServerRequestFactory;
use Laminas\Diactoros\StreamFactory;
use Laminas\Diactoros\UploadedFileFactory;

ini_set('display_errors', 'stderr');
require 'vendor/autoload.php';

$worker = new RoadRunner\Worker(new Goridge\StreamRelay(STDIN, STDOUT));
$psr7 = new RoadRunner\PSR7Client($worker);
$httpFoundationFactory = new HttpFoundationFactory();

/** @var Application $app */
$app = require __DIR__.'/bootstrap/app.php';

$rr = new RoadrunnerLaravelBridge($app, __DIR__);

$psr7factory = new PsrHttpFactory(
    new ServerRequestFactory(),
    new StreamFactory(),
    new UploadedFileFactory(),
    new ResponseFactory()
);

while ($req = $psr7->acceptRequest()) {
    try {
        $symfonyRequest = $httpFoundationFactory->createRequest($req);
        $request = Request::createFromBase($symfonyRequest);

        $response = $rr->request($request);

        $psr7response = $psr7factory->createResponse($response);
        $psr7->respond($psr7response);
    } catch (Throwable $e) {
        $psr7->getWorker()->error((string) $e);
    }
}