Skip to content
PHP Ecosystem
Explore

PSR bridge

This content is not available in your language yet.

Transform your Yii2 applications into high-performance, PSR-compliant powerhouses

Supporting traditional SAPI, RoadRunner, FrankenPHP, and worker-based architectures

Run a Yii application with PSR-7 requests and responses, including long-running workers. The bridge provides a PSR-15 request handler, Yii request/response adapters, upload conversion, and a streaming SAPI emitter.

Long-running PHP workers for higher throughput and lower latency.

Feature Overview

Requires the filter and mbstring PHP extensions. Install a PSR-7/PSR-17 implementation alongside the bridge; the example uses HttpSoft:

Terminal window
composer require yii2-extensions/psr-bridge:^0.4 httpsoft/http-message

See installation.

In an existing Yii application, use this entry script in place of the usual Application::run(). The example assumes web/index.php, Composer dependencies, and the application’s config/web.php with its routes and secret request.cookieValidationKey already configured.

<?php
declare(strict_types=1);
use HttpSoft\Message\{ResponseFactory, ServerRequestFactory, StreamFactory, UploadedFileFactory};
use Psr\Http\Message\{ResponseFactoryInterface, StreamFactoryInterface};
use yii2\extensions\psrbridge\creator\ServerRequestCreator;
use yii2\extensions\psrbridge\emitter\SapiEmitter;
use yii2\extensions\psrbridge\http\Application;
ini_set('session.use_cookies', '0');
require dirname(__DIR__) . '/vendor/autoload.php';
require dirname(__DIR__) . '/vendor/yiisoft/yii2/Yii.php';
$config = require dirname(__DIR__) . '/config/web.php';
$config['container']['definitions'][ResponseFactoryInterface::class] = ResponseFactory::class;
$config['container']['definitions'][StreamFactoryInterface::class] = StreamFactory::class;
$app = new Application($config);
$creator = new ServerRequestCreator(new ServerRequestFactory(), new StreamFactory(), new UploadedFileFactory());
$request = $creator->createFromGlobals();
$response = $app->handle($request);
$emitted = false;
try {
(new SapiEmitter())->emit($response, $request->getMethod() !== 'HEAD');
$emitted = true;
} finally {
$app->finalize($emitted);
}

Application supplies the bridge request, response, and error handler by default. For a worker, create the application once and repeat handle(), runtime emission, then finalize() for each request. Keep file streams open until emission completes. A PSR-15 host must arrange this extra finalization step.

useSession=false skips eager session opening around bootstrap; session IDs are still isolated on every request. Keep request-scoped components out of persistentComponents.

See the configuration guide before changing lifecycle settings or handling JSON bodies created from SAPI globals.

Practical guides and complete examples for PSR-7 integration and the worker lifecycle.

AI agents: use the repository guides and source for the installed revision. For a documentation deployment with llms.txt, read that index first. When Markdown export is enabled, append index.md to a page URL. For Yii conventions, use the yii2-framework skill from a local framework documentation checkout.

If the hosted sources are unavailable, use the repository guides and locally available skills.

Follow on X Follow on Facebook Join our Subreddit Join on Telegram

License