/php-fpm-cli

Run PHP scripts through FastCGI from the command line

Primary LanguagePHPMozilla Public License 2.0MPL-2.0

php-fpm-cli

Run PHP scripts through FastCGI from the command line

Build Status

Overview

A PHP CLI script to run PHP scripts through a php-fpm worker that is also a pure-PHP FastCGI request CLI.

Usage

Usage: php-fpm-cli -c <socket> [options] [script]

  -c, --connect <socket>     Connect to <socket> file or host:port
  -p, --param <key>=<value>  FCGI request <key>=<value> param
  -b, --body <body>          FCGI request STDIN <body>
  -d, --data <file>          FCGI request STDIN body from <file>
  -i, --include              FCGI response headers included in output
  -t, --timeout <duration>   Connect timeout in milliseconds
  -h, --help                 Display help and exit
  -v, --version              Display version and exit

Examples

Clear opcache

The cache used by fpm workers and the CLI is separate, so we need to run it inside a php-fpm worker.

<?php
printf("%d\n", opcache_reset());
$ php-fpm-cli -c /var/run/php-fpm.sock opcache-reset.php
1

GET request with a query string

A query string can be pass by the FCGI parameter.

<?php
var_dump($_GET);
$ php-fpm-cli -c /var/run/php-fpm.sock -p 'QUERY_STRING=foo=bar&baz=qux' dump-get.php
array(2) {
  ["foo"]=>
  string(3) "bar"
  ["baz"]=>
  string(3) "qux"
}

POST request

A request body can be added which PHP will automatically parse with the correct content type.

<?php
var_dump($_POST);
$ php-fpm-cli -c /var/run/php-fpm.sock -p 'CONTENT_TYPE=application/x-www-form-urlencoded' -b 'foo=bar&baz=qux' dump-post.php
array(2) {
  ["foo"]=>
  string(3) "bar"
  ["baz"]=>
  string(3) "qux"
}

PUT request

The default REQUEST_METHOD can be overridden.

<?php
echo md5(file_get_contents('php://input')), "\n";
Hello world!
$ php-fpm-cli -c /var/run/php-fpm.sock -p 'REQUEST_METHOD=PUT' -d file.txt put.php
86fb269d190d2c85f6e0468ceca42a20

Headers

Sending and printing headers (a non-2XX response produces a non-zero exit code).

<?php
http_response_code(403);
header("X-Foo: {$_SERVER['HTTP_X_BAZ']}");
echo "Headers above\n";
$ php-fpm-cli --c /var/run/php-fpm.sock -p 'HTTP_X_BAZ=Bar' -i headers.php
Status: 403 Forbidden
X-Powered-By: PHP/X.X.X
X-Foo: Bar
Content-type: text/html; charset=UTF-8

Headers above
$ echo $?
1

Manual request

The FastCGI request can be manually constructed with just params.

<?php
echo "{$_SERVER['REQUEST_METHOD']} {$_SERVER['SCRIPT_FILENAME']}\n";
$ php-fpm-cli -c /var/run/php-fpm.sock -p 'SCRIPT_FILENAME=/path/to/script.php' -p 'REQUEST_METHOD=GET'
GET /path/to/script.php

Compatibility

Designed to be backwards compatible from PHP 5.0.0 onward.

Compatibility with PHP versions before 5.5.36 is not guaranteed for lack of compatible docker images to test with.

If you have compatiability issues, bug reports and patches are welcome!

License

Copyright (c) 2024 Alexander O'Mara

Licensed under the Mozilla Public License, v. 2.0.

If this license does not work for you, feel free to contact me.