Simplifies management of a real php-cgi
worker process or php-fpm
worker pool.
Leverages the excellent hollodotme/fast-cgi-client for a FastCGI API.
Easy testing of a FastCGI application's behaviour across requests: for example, ensuring that opcache is cleared correctly when expected.
$ composer install --dev asmblah/fast-cgi
Use PhpCgiLauncher
for php-cgi
.
<?php
declare(strict_types=1);
use Asmblah\FastCgi\FastCgi;
use Asmblah\FastCgi\Launcher\PhpCgiLauncher;
require_once __DIR__ . '/vendor/autoload.php';
$baseDir = __DIR__;
$wwwDir = 'www'; // Relative to $baseDir.
$phpCgiBinaryPath = dirname(PHP_BINARY) . '/php-cgi';
$dataDir = $baseDir . '/var/test';
@mkdir($dataDir, 0700, true);
$socketPath = $dataDir . '/php-cgi.test.sock';
$fastCgi = new FastCgi(
baseDir: $baseDir,
wwwDir: $wwwDir,
socketPath: $socketPath,
launcher: new PhpCgiLauncher($phpCgiBinaryPath)
);
$session = $fastCgi->start();
$response = $session->sendGetRequest(
'my_script.php',
'/path/to/my-page',
[
'greeting' => 'Hello',
]
);
// Will print "Hello from my front controller!".
print $response->getBody() . PHP_EOL;
$session->quit();
<?php
declare(strict_types=1);
print ($_GET['greeting'] ?? '(none)') . ' from my front controller!';
$ php test.php
Hello from my front controller!
Use PhpFpmLauncher
for php-fpm
.
<?php
declare(strict_types=1);
use Asmblah\FastCgi\FastCgi;
use Asmblah\FastCgi\Launcher\PhpFpmLauncher;
require_once __DIR__ . '/vendor/autoload.php';
$baseDir = __DIR__;
$wwwDir = 'www'; // Relative to $baseDir.
$phpFpmBinaryPath = dirname(PHP_BINARY, 2) . '/sbin/php-fpm';
$dataDir = $baseDir . '/var/test';
@mkdir($dataDir, 0700, true);
$socketPath = $dataDir . '/php-fpm.test.sock';
$logFilePath = $dataDir . '/php-fpm.log';
$configFilePath = $dataDir . '/php-fpm.conf';
file_put_contents($configFilePath, <<<CONFIG
[global]
error_log = $logFilePath
[www]
listen = $socketPath
pm = static
pm.max_children = 1
CONFIG
);
$fastCgi = new FastCgi(
baseDir: $baseDir,
wwwDir: $wwwDir,
socketPath: $socketPath,
launcher: new PhpFpmLauncher(
$phpFpmBinaryPath,
$configFilePath
)
);
$session = $fastCgi->start();
$response = $session->sendGetRequest(
'my_script.php',
'/path/to/my-page',
[
'greeting' => 'Hello',
]
);
// Will print "Hello from my front controller!".
print $response->getBody() . PHP_EOL;
$session->quit();
<?php
declare(strict_types=1);
print ($_GET['greeting'] ?? '(none)') . ' from my front controller!';
$ php test.php
Hello from my front controller!