How to use roadrunner server with slimphp?

I want to use roadrunner as PHP application server for slimphp. Has anyone used it before?

Take this as a starting point, )$app is your Slim4 application but you should be able to handle it yourself):

./psr-worker.php

<?php

declare(strict_types=1);

require './vendor/autoload.php';

use Dhosting\AiCrowd\Common\StdLogger\ThrowableMessageFormatter;
use Dotenv\Dotenv;
use Nyholm\Psr7\Response;
use Nyholm\Psr7\Factory\Psr17Factory;
use Psr\Container\ContainerInterface;
use Slim\App;
use Spiral\RoadRunner\Worker;
use Spiral\RoadRunner\Http\PSR7Worker;

$dotEnv = Dotenv::createImmutable('./');
$dotEnv->load();

require './bootstrap/bootstrap.php';

if (isset($app)) {
    $worker = Worker::create();

    $factory = new Psr17Factory();

    $psr7 = new PSR7Worker($worker, $factory, $factory, $factory);

    while (true) {
        try {
            $request = $psr7->waitRequest();
            if ($request === null) {
                break;
            }
        } catch (Throwable $t) {
            try {
                $psr7->respond(new Response(200, [], $t->getMessage()));
                error_log(ThrowableMessageFormatter::format($t));
            } catch (Throwable $t) {
                error_log(ThrowableMessageFormatter::format($t));
            }
            continue;
        }
        try {
            /** @var App<ContainerInterface> $app */
            $psr7->respond($app->handle($request));
        } catch (Throwable $t) {
            try {
                $psr7->respond(new Response(500, [], $t->getMessage()));
                error_log(ThrowableMessageFormatter::format($t));
            } catch (Throwable $t) {
                error_log(ThrowableMessageFormatter::format($t));
            }

            $psr7->getWorker()->error((string)$t);
        }
    }
}

./bootstrap/bootstrap.php

<?php

declare(strict_types=1);

use DI\ContainerBuilder;
use Slim\App;

$builder = new ContainerBuilder();
$builder->useAutowiring(true);
$definitions = array_merge(
    require './config/settings/settings.php',
    require './config/dependencies/dependencies.php',
);
$builder->addDefinitions($definitions);
$container = $builder->build();

$app = $container->get(App::class);

require './bootstrap/middleware.php';
require './bootstrap/routes.php';

./rr.yaml

version: '3'
server:
  command: "php psr-worker.php"
http:
  address: 0.0.0.0:80
  pool:
    num_workers: 1
    debug: true

and finally trigger the roadrunner server:

./rr serve -c .rr.yaml
1 Like