# README
RoadRunner is an open source (MIT licensed) high-performance PHP application server, load balancer and process manager. It supports running as a service with the ability to extend its functionality on a per-project basis.
RoadRunner includes PSR-7/PSR-17 compatible HTTP and HTTP/2 server and can be used to replace classic Nginx+FPM setup with much greater performance and flexibility.
Table of Contents
- Introduction
- Using RoadRunner
- Integrations
- Laravel Framework (alpha)
- Slim Framework (pending verification)
- Symfony Framework
- Yii2/3 Framework (in progress)
- Server Customization
- Additional Notes
- Custom Builds
Features:
- production ready
- PSR-7 HTTP server (file uploads, error handling, static files, hot reload, middlewares, event listeners)
- HTTPS and HTTP/2 support (including HTTP/2 Push)
- fully customizable server
- flexible environment configuration
- no external PHP dependencies, drop-in (based on Goridge)
- load balancer, process manager and task pipeline
- frontend agnostic (Queue, PSR-7, GRPC, etc)
- works over TCP, unix sockets and standard pipes
- automatic worker replacement and safe PHP process destruction
- worker lifecycle management (create/allocate/destroy timeouts)
- payload context and body
- control over max jobs per worker
- protocol, worker and job level error management (including PHP errors)
- memory leak failswitch
- very fast (~250k rpc calls per second on Ryzen 1700X using 16 threads)
- works on Windows
Example:
<?php
ini_set('display_errors', 'stderr');
include "vendor/autoload.php";
$relay = new Spiral\Goridge\StreamRelay(STDIN, STDOUT);
$psr7 = new Spiral\RoadRunner\PSR7Client(new Spiral\RoadRunner\Worker($relay));
while ($req = $psr7->acceptRequest()) {
try {
$resp = new \Zend\Diactoros\Response();
$resp->getBody()->write("hello world");
$psr7->respond($resp);
} catch (\Throwable $e) {
$psr7->getWorker()->error((string)$e);
}
}
Configuration can be located in .rr.yaml
file:
http:
address: 0.0.0.0:8080
workers:
command: "php psr-worker.php"
pool:
numWorkers: 4
Read more in Wiki.
License:
The MIT License (MIT). Please see LICENSE
for more information. Maintained by SpiralScout.
# Functions
NewPipeFactory returns new factory instance and starts listening.
NewPool creates new worker pool and task multiplexer.
NewServer creates new router.
NewSocketFactory returns SocketFactory attached to a given socket lsn.
# Constants
EventPoolConstruct triggered when server creates new pool.
EventPoolDestruct triggered when server destroys existed pool.
EventPoolError caused on pool wide errors.
EventServerFailure triggered when server is unable to replace dead pool.
EventServerStart triggered when server creates new pool.
EventServerStop triggered when server creates new pool.
EventStderrOutput - is triggered when worker sends data into stderr.
EventWorkerConstruct thrown when new worker is spawned.
EventWorkerDead thrown when worker stops worker for any reason.
EventWorkerDestruct thrown after worker destruction.
EventWorkerError thrown any worker related even happen (passed with WorkerError).
EventWorkerKill thrown after worker is being forcefully killed.
StateErrored - error state (can't be used).
StateInactive - no associated process.
StateReady - ready for job.
StateStopped - process has been terminated.
StateStopping - process is being softly stopped.
StateStreaming - indicates that worker is streaming the data at the moment.
StateWorking - working on given payload.
StopRequest can be sent by worker to indicate that restart is required.
WaitDuration - for how long error buffer should attempt to aggregate error messages before merging output together since lastError update (required to keep error update together).
# Structs
Config defines basic behaviour of worker creation and handling process.
Payload carries binary header and body to workers and back to the server.
PipeFactory connects to workers using standard streams (STDIN, STDOUT pipes).
Server manages pool creation and swapping.
ServerConfig config combines factory, pool and cmd configurations.
SocketFactory connects to external workers using socket server.
StaticPool controls worker creation, destruction and task routing.
Worker - supervised process with api over goridge.Relay.
WorkerError is worker related error.
# Type aliases
JobError is job level error (no worker halt), wraps at top of error context.