Transform your Yii2 applications into high-performance, PSR-compliant powerhouses
Supporting traditional SAPI, RoadRunner, FrankenPHP, and worker-based architectures
Long-running PHP workers for higher throughput and lower latency.
composer require yii2-extensions/psr-bridge:^0.3<?php
declare(strict_types=1);
// disable PHP automatic session cookie handling
ini_set('session.use_cookies', '0');
require_once dirname(__DIR__) . '/vendor/autoload.php';
use yii2\extensions\frankenphp\FrankenPHP;
use yii2\extensions\psrbridge\http\Application;
// Load environment variables from .env file
$dotenv = Dotenv\Dotenv::createImmutable(dirname(__DIR__));
$dotenv->safeLoad();
// production default (change to 'true' for development)
define('YII_DEBUG', filter_var($_ENV['YII_DEBUG'] ?? false, FILTER_VALIDATE_BOOLEAN));
// production default (change to 'dev' for development)
define('YII_ENV', $_ENV['YII_ENV'] ?? 'prod');
require_once dirname(__DIR__) . '/vendor/yiisoft/yii2/Yii.php';
$config = require_once dirname(__DIR__) . '/config/web/app.php';
$app = new Application($config);
$runner = new FrankenPHP($app);
$runner->run();<?php
declare(strict_types=1);
require __DIR__ . '/../vendor/autoload.php';
use yii2\extensions\psrbridge\http\Application;
use yii2\extensions\roadrunner\RoadRunner;
define('YII_DEBUG', filter_var(getenv('YII_DEBUG'), FILTER_VALIDATE_BOOLEAN));
define('YII_ENV', getenv('YII_ENV') ?? 'prod');
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
$config = require dirname(__DIR__) . '/config/web/app.php';
$app = new Application($config);
$runner = new RoadRunner($app);
$runner->run();// Convert Yii2 request to PSR-7
$request = Yii::$app->request;
$psr7Request = $request->getPsr7Request();
// Convert Yii2 response to PSR-7
$response = Yii::$app->response;
$psr7Response = $response->getPsr7Response();
// Emit PSR-7 response
$emitter = new yii2\extensions\psrbridge\emitter\SapiEmitter();
$emitter->emit($psr7Response);Note
This shows the low-level conversion API. Serving a full request in a long-running worker goes through the
handle() β emit β finalize() cycle (or a runner). See
Response lifecycle finalization.
In long-running workers, keep Application lifecycle defaults unless you have a specific requirement:
useSession=truesyncCookieValidation=trueresetUploadedFiles=true
Warning
Keep request-scoped components (request, response, errorHandler, session, user) out of
Application::$persistentComponents.
Components listed in Application::$persistentComponents (defaults to db and cache) keep loaded instances across
requests.
Define lifecycle flags before run() (via config or property setters).
$config = [
'class' => Application::class,
// disable session and cookie validation sync for stateless REST APIs.
// keep resetUploadedFiles=true (default) for request isolation.
'useSession' => false,
'syncCookieValidation' => false,
'resetUploadedFiles' => true,
];The bridge automatically parses incoming PSR-7 request bodies based on the Content-Type header and your configured
parsers (for example, application/json), ensuring Yii::$app->request->post() works seamlessly in worker mode without
extra boilerplate.
For detailed configuration options and advanced usage.
- π Installation Guide
- βοΈ Configuration Reference
- π‘ Usage Examples
- π§ͺ Testing Guide