phpsgi / funk
An implementation of PHPSGI middleware specification
Installs: 950
Dependents: 11
Suggesters: 0
Security: 0
Stars: 14
Watchers: 5
Forks: 0
Open Issues: 2
pkg:composer/phpsgi/funk
Requires
- phpsgi/phpsgi: @dev
- universal/universal: 2.0.x-dev
Requires (Dev)
- corneltek/pux: 2.0.x-dev
- willdurand/geocoder: ^3.1
- willdurand/negotiation: ^1.4
Suggests
- corneltek/cliframework: 4.0.x-dev
- corneltek/pux: 2.0.x-dev
This package is not auto-updated.
Last update: 2025-10-23 20:41:40 UTC
README
Funk is an implementation of PHPSGI. It supports HTTP servers implemented with PHP SAPI (Apache2 mod_php, php-fpm, fastcgi), therefore you can integrate your application with Funk and switch to different HTTP server implementation.
PHPSGI and Funk aims to provide lightweight HTTP interfaces, middlewares for web frameworks. It's a bit different from the PSR-7 spec. PHPSGI focuses on the core data structure instead of forcing components to implement the interface requirements.
Components
- HTTP server (with event extension or
socket_select) - SAPI support (php-fpm, apache2 php handler servers)
- Middlewares
- Middleware Compositor
- A Simple Mux Builder (integrated with Pux)
Environment
// This creates $env array from $_SERVER, $_REQUEST, $_POST, $_GET ... $env = Environment::createFromGlobals();
Application
$app = function(array & $environment, array $response) { return [ 200, [ 'Content-Type' => 'text/plain' ], 'Hello World' ]; };
Responder
SAPIResponder
You can integrate your application with SAPIResponder to support Apache2 php handler / php-fpm / fastcgi.
use Funk\Responder\SAPIResponder; $fd = fopen('php://output', 'w'); $responder = new SAPIResponder($fd); $responder->respond([ 200, [ 'Content-Type: text/plain' ], 'Hello World' ]); fclose($fd);
use Funk\Responder\SAPIResponder; $env = Environment::createFromGlobals(); $app = function(array & $environment, array $response) { return [ 200, [ 'Content-Type' => 'text/plain' ], 'Hello World' ]; }; $fd = fopen('php://output', 'w'); $responder = new SAPIResponder($fd); $responder->respond($app($env, [])); fclose($fd);
Middleware
Funk\Middleware\ContentNegotiationMiddlewareFunk\Middleware\CORSMiddlewareFunk\Middleware\GeocoderMiddlewareFunk\Middleware\HeadMiddlewareFunk\Middleware\TryCatchMiddlewareFunk\Middleware\XHProfMiddlewareFunk\Middleware\XHTTPMiddleware
use Funk\Environment; use Funk\Middleware\TryCacheMiddleware; $app = function(array $environment, array $response) { return [ 200, ['Content-Type' => 'text/html' ], 'Hello World' ]; }; $middleware = new TryCatchMiddleware($app); $env = Environment::createFromGlobals(); $response = $middleware($env, [200, [], []]);
Contributing
Testing XHProf Middleware
Define your XHPROF_ROOT in your phpunit.xml, you can copy phpunit.xml.dist to phpunit.xml,
for example:
<php> <env name="XHPROF_ROOT" value="/Users/c9s/src/php/xhprof"/> </php>