PHP Runtimes
In early 2021, Symfony created a "Runtime component". This component may look complex, weird and full of hacks but it is a game changer for how we run PHP applications.
With the Runtime component, we can look at each application as a "black box". A box that has no connection to globals like $_SERVER
or $_GET
. To run the application you need (you guessed it) a Runtime
. It is a class that looks at the black box to figure out what input it requires and handles the output.
Consider this small application that returns an UUID.
namespace Acme;
class Application
{
public function run() {
return Uuid::uuid4()->toString();
}
}
To use this application with the Runtime component. We need our front-controller to return a callable that will create the application.
// index.php
return function() {
return new Acme\Application();
}
If you want to use this application in a CLI environment, you need a Runtime
that knows how to run an Acme\Application
object and print the output on CLI. If you want to use it with Nginx/PHP-FPM then you need another Runtime
that converts the application's output to a HTTP response.
Why is this a good thing?
Since your application is not connected to the global state, it is very portable. It is easy to create a Runtime
to run the application with Bref, Swoole or ReactPHP without making any change to the application itself.
Since most modern PHP application is based on Symfony's HttpKernel, PSR-7 or PSR-15 we don't need too many different runtimes. This organization holds many PHP packages with runtimes for the most popular environments. It is not "the source of all runtimes", but rather a temporary place where runtimes can live before they move in to Bref/Swoole/RoadRunner etc.
All runtimes have hard dependencies to make installation easier. Everything should "just work".
Available Runtimes
Bref
Run your application on AWS Lambda with Bref.
ReactPHP
Event-driven, non-blocking I/O with ReactPHP.
RoadRunner
Spin up multiple PHP processes with Golang using RoadRunner.
- https://github.com/php-runtime/roadrunner-nyholm
- https://github.com/php-runtime/roadrunner-symfony-nyholm
Swoole
Build high-performance, scalable, concurrent HTTP services with Swoole.
PHP-FPM and traditional web servers
These runtimes are for PHP-FPM and the more traditional web servers one might use for local development.
Laravel
A runtime for Laravel and Artisan.
PSR-7 and PSR-15
Use the popular PSR architecture.
Symfony
The runtime for Symfony is included in the runtime component.
Contribute
Contributions are always welcomed. Send you PR or open an issue here: https://github.com/php-runtime/runtime