spiral/roadrunner-bridge

RoadRunner integration package

v3.5.0 2024-04-12 09:16 UTC

README

PHP Version Require Latest Stable Version phpunit psalm Codecov Total Downloads StyleCI 68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646973636f72642d636861742d6d6167656e74612e737667

Requirements

Make sure that your server is configured with following PHP version and extensions:

  • PHP 8.1+
  • Spiral Framework 3.7+

Installation

To install the package:

composer require spiral/roadrunner-bridge

After package install you need to add bootloaders from the package in your application on the top of the list.

use Spiral\RoadRunnerBridge\Bootloader as RoadRunnerBridge;

protected const LOAD = [
    RoadRunnerBridge\HttpBootloader::class, // Optional, if it needs to work with http plugin
    RoadRunnerBridge\QueueBootloader::class, // Optional, if it needs to work with jobs plugin
    RoadRunnerBridge\CacheBootloader::class, // Optional, if it needs to work with KV plugin
    RoadRunnerBridge\GRPCBootloader::class, // Optional, if it needs to work with GRPC plugin
    RoadRunnerBridge\CentrifugoBootloader::class, // Optional, if it needs to work with centrifugo server
    RoadRunnerBridge\TcpBootloader::class, // Optional, if it needs to work with TCP plugin
    RoadRunnerBridge\MetricsBootloader::class, // Optional, if it needs to work with metrics plugin
    RoadRunnerBridge\LoggerBootloader::class, // Optional, if it needs to work with app-logger plugin
    RoadRunnerBridge\LockBootloader::class, // Optional, if it needs to work with lock plugin
    RoadRunnerBridge\ScaffolderBootloader::class, // Optional, to generate Centrifugo handlers and TCP services via Scaffolder
    RoadRunnerBridge\CommandBootloader::class,
    // ...
];

Usage

TCP

RoadRunner includes TCP server and can be used to replace classic TCP setup with much greater performance and flexibility.

Bootloader

Add Spiral\RoadRunnerBridge\Bootloader\TcpBootloader to application bootloaders list:

use Spiral\RoadRunnerBridge\Bootloader as RoadRunnerBridge;

protected const LOAD = [
    // ...
    RoadRunnerBridge\TcpBootloader::class,
    // ...
];

This bootloader adds a dispatcher and necessary services for TCP to work. Also, using the addService and addInterceptors methods can dynamically add services to TCP servers and configure interceptors.

Configuration

Configure tcp section in the RoadRunner .rr.yaml configuration file with needed TCP servers. Example:

tcp:
  servers:
    smtp:
      addr: tcp://127.0.0.1:22
      delimiter: "\r\n" # by default
    monolog:
      addr: tcp://127.0.0.1:9913

  pool:
    num_workers: 2
    max_jobs: 0
    allocate_timeout: 60s
    destroy_timeout: 60s

Create configuration file app/config/tcp.php. In the configuration, it's required to specify the services that will handle requests from a specific TCP server. Optionally, interceptors can be added for each specific server. With the help there, can add some logic before handling the request in service. Configuration example:

<?php

declare(strict_types=1);

return [
    /**
     * Services for each server.
     */
    'services' => [
        'smtp' => SomeService::class,
        'monolog' => OtherService::class
    ],

    /**
     * Interceptors, this section is optional.
     * @see https://spiral.dev/docs/cookbook-domain-core/2.8/en#core-interceptors
     */
    'interceptors' => [
        // several interceptors
        'smtp' => [
            SomeInterceptor::class,
            OtherInterceptor::class
        ],
        'monolog' => SomeInterceptor::class // one interceptor
    ],

    'debug' => env('TCP_DEBUG', false)
];

Services

A service must implement the interface Spiral\RoadRunnerBridge\Tcp\Service\ServiceInterface with one required method handle. After processing a request, the handle method must return the Spiral\RoadRunnerBridge\Tcp\Response\ResponseInterface object with result (RespondMessage, CloseConnection, ContinueRead).

Example:

<?php

declare(strict_types=1);

namespace App\Tcp\Service;

use Spiral\RoadRunner\Tcp\Request;
use Spiral\RoadRunnerBridge\Tcp\Response\RespondMessage;
use Spiral\RoadRunnerBridge\Tcp\Response\ResponseInterface;
use Spiral\RoadRunnerBridge\Tcp\Service\ServiceInterface;

class TestService implements ServiceInterface
{
    public function handle(Request $request): ResponseInterface
    {
        // some logic

        return new RespondMessage('some message', true);
    }
}

The service can be generated using the Scaffolder component. Make sure that bootloader Spiral\RoadRunnerBridge\Bootloader\ScaffolderBootloader is added in your application and run:

php app.php create:tcp-service Test

This will generate service TestService in the folder Endpoint/Tcp/Service/TestService.php.

Note Namespace (and generation path) can be configured. Read more about Scaffolder component.

Note Read more about RoadRunner configuration on official site https://roadrunner.dev.

License:

MIT License (MIT). Please see LICENSE for more information. Maintained by Spiral Scout.