yii2-extensions / road-runner
Yii2 Road Runner runtime.
Fund package maintenance!
terabytesoftw
Requires
- php: >=8.1
- ext-sockets: *
- psr/http-factory: ^1.1
- psr/http-message: ^2.0
- spiral/roadrunner: ^2025.1.2
- spiral/roadrunner-cli: ^2.5.0
- spiral/roadrunner-http: ^v3.0.0
- spiral/roadrunner-worker: ^3.0.0
- yii2-extensions/psr-bridge: ^0.1@dev
Requires (Dev)
- httpsoft/http-message: ^1.1
- infection/infection: ^0.27|^0.31
- maglnet/composer-require-checker: ^4.1
- phpstan/extension-installer: ^1.4
- phpstan/phpstan-strict-rules: ^2.0.3
- phpunit/phpunit: ^10.5
- rector/rector: ^2.1
- symplify/easy-coding-standard: ^12.5
- yii2-extensions/phpstan: ^0.3
This package is auto-updated.
Last update: 2025-08-31 22:25:03 UTC
README
Extension for Road Runner
A high-performance RoadRunner integration for Yii2 applications that provides seamless PSR-7 request handling with automatic memory management and error reporting.
Features
- ✅ Automatic Memory Management: Smart cleanup with configurable memory limits.
- ✅ Error Handling: Comprehensive error reporting to RoadRunner worker.
- ✅ Graceful Shutdown: Automatic worker restart when memory usage is high.
- ✅ High Performance: Utilize RoadRunner's blazing-fast HTTP server for your Yii2 applications.
- ✅ Production Ready: Battle-tested error handling and worker lifecycle management.
- ✅ PSR-7 Compatible: Full PSR-7 request/response handling through the PSR bridge.
- ✅ Stateless Design: Memory-efficient stateless application lifecycle.
- ✅ Zero Configuration: Works out of the box with minimal setup.
Installation
Quick start
composer require yii2-extensions/road-runner:^0.1.0@dev
Basic Usage
Create your RoadRunner entry point (web/index.php
)
<?php declare(strict_types=1); use yii2\extensions\psrbridge\http\StatelessApplication; use yii2\extensions\roadrunner\RoadRunner; // production default (change to 'true' for development) defined('YII_DEBUG') or define('YII_DEBUG', false); // production default (change to 'dev' for development) defined('YII_ENV') or define('YII_ENV', 'prod'); require __DIR__ . '/../vendor/autoload.php'; require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; $config = require dirname(__DIR__) . '/config/web.php'; $runner = new RoadRunner(new StatelessApplication($config)); $runner->run();
RoadRunner configuration
Create .rr.yaml
in your project root
version: '3' rpc: listen: 'tcp://127.0.0.1:6001' server: command: 'php web/index.php' relay: pipes http: address: '0.0.0.0:8080' headers: response: "Cache-Control": "no-cache" middleware: - static # serve files first - gzip # compress dynamic output static: dir: web forbid: - .php - .htaccess pool: num_workers: 1 supervisor: max_worker_memory: 100 jobs: pool: num_workers: 2 max_worker_memory: 100 consume: { } kv: local: driver: memory config: interval: 60 metrics: address: '127.0.0.1:2112'
Start the server
# install RoadRunner binary vendor/bin/rr get # start the server ./rr serve
Your applicaion will be available at
http://127.0.0.1:8080
(orhttp://localhost:8080
) or at the address set inhttp.address
in.rr.yaml
.
Development & Debugging
For enhanced debugging capabilities and proper time display in RoadRunner, install the worker debug extension.
composer require --dev yii2-extensions/worker-debug:^0.1
Add the following to your development configuration (config/web.php
):
<?php declare(strict_types=1); use yii2\extensions\debug\WorkerDebugModule; if (YII_ENV_DEV) { // configuration adjustments for 'dev' environment $config['bootstrap'][] = 'debug'; $config['modules']['debug'] = [ 'class' => WorkerDebugModule::class, // uncomment the following to add your IP if you are not connecting from localhost. //'allowedIPs' => ['127.0.0.1', '::1'], ]; }
File Upload Handling
For enhanced file upload support in worker environments, use the PSR-7 bridge UploadedFile class instead of the standard Yii2 implementation.
<?php declare(strict_types=1); use yii2\extensions\psrbridge\http\{Response, UploadedFile}; final class FileController extends \yii\web\Controller { public function actionUpload(): Response { $file = UploadedFile::getInstanceByName('avatar'); if ($file !== null && $file->error === UPLOAD_ERR_OK) { $file->saveAs('@webroot/uploads/' . $file->name); } return $this->asJson(['status' => 'uploaded']); } }
Documentation
For detailed configuration options and advanced usage.