FastCGI Process Manager (FPM)


FPM (FastCGI Process Manager) ist eine Alternative zu PHP FastCGI mit einigen zusätzlichen Features (besonders) für Websites mit hoher Last.

Zu diesen Features gehören:

  • fortschrittliches Prozessmanagement mit sanftem Stop/Start

  • die Möglichkeit einzelne Prozesse mit unterschiedlichen uid/gid/chroot/environment Einstellungen zu starten, auf unterschiedlichen Ports Anfragen entgegen zu nehmen, sowie jeweils eigene php.ini (ersetzt den safe_mode) verwenden zu können

  • Logging auf stdout und stderr

  • Notfall-Neustart, für den Fall einer zufälligen Zerstörung des Opcode-Caches

  • Unterstützung für beschleunigten Upload

  • "slowlog" - loggen von Scripts (nicht nur deren Namen, sondern deren PHP Backtraces, wobei ptrace und andere Dinge zum Einsatz kommen, um die "execute_data" des Prozesses zu debuggen) die ungewöhnlich langsam ausgeführt werden

  • fastcgi_finish_request() - Spezialfunktion, um Anfragen zu beenden und alle Daten zu senden, während gleichzeitig etwas zeitintensives, wie Videokonvertierung oder Statistik-Verarbeitung abläuft

  • dynamisches und statisches Starten von Kindprozessen

  • einfache SAPI Status Info (vergleichbar mit Apache mod_status)

  • php.ini-basierte Konfigurationsdatei

add a note add a note

User Contributed Notes 7 notes

robin at robinwinslow dot co dot uk
7 years ago
Init script setup

You will probably want to create an init script for your new php-fpm. Fortunately, PHP 5.3.3 provides one for you, which you should copy to your init directory and change permissions:

$ cp <php-5.3.3-source-dir>/sapi/fpm/ /etc/init.d/php-fpm
$ chmod 755 /etc/init.d/php-fpm

It requires a certain amount of setup. First of all, make sure your php-fpm.conf file is set up to  create a PID file when php-fpm starts. E.g.:
pid = /var/run/
(also make sure your php-fpm user has permission to create this file).

Now open up your new init script (/etc/init.d/php-fpm) and set the variables at the top to their relevant values. E.g.:

Your init script is now ready. You should now be able to start, stop and reload php-fpm:

$ /etc/init.d/php-fpm start
$ /etc/init.d/php-fpm stop
$ /etc/init.d/php-fpm reload

The one remaining thing you may wish to do is to add your new php-fpm init script to system start-up. E.g. in CentOS:

$ /sbin/chkconfig php-fpm on


Disclaimer: Although I did just do this on my own server about 20 mins ago, everything I've written here is off the top of my head, so it may not be 100% correct. Also, allow for differences in system setup. Some understanding of what you are doing is assumed.
kokushibyou at gmail dot com
4 years ago
PHP-FPM is FAST - but be wary of using it while your code base is stored on NFS - under average load your NFS server will feel some serious strain. I have yet to find a work around for this bug:
joel k
6 years ago
the fpm process supports the USER2 signal, which is used to reload the config file.

kill -USR2 [pid]

should do the trick.
dreamcat4 at gmail dot com
3 years ago
Doesn't work? Enable logging!

The php-fpm.log file is a great place to fault-find errors and get to the bottom of a problem. But be sure to enable logging for your specific worker pool. Or you won't see anything!


To enable error logging for the default [www] worker pool, add this line in the [www] section of your php-fpm.conf:

catch_workers_output = yes
user at NOSPAM dot example dot com
6 months ago
It is important to note that FPM is not built with the windows binaries.  Many of the guides you may find online rely on php-cgi.exe.  Unfortunately they call it FPM but this is incorrect!

The executable php-cgi.exe that is bundled with the windows binaries is a FastCGI interface but it is *not* FPM (Fastcgi Process Manager).  php-cgi.exe does not have multi-threading or concurrent request support, nor support for any of the FPM configuration options.

The only solid information I've gathered into why FPM is not available is a bug report explaining that FPM is built around fork(), which is not natively available on windows (
ikrabbe dot ask at gmail dot com
1 month ago
I'm very unhappy with the way php-fpm handles requests.
There isn't even some SCRIPT_FILENAME in the RFC for CGI, an that's the only standard I found to handle the requests.

Actually what you are doing with PATH_TRANSLATED is supposed to translate to the path, which is broken by media wikis, as they use the PATH_INFO to find the ressource, not some script.

In the original CGI context, the PATH_INFO is passed to the CGI binary to specify some ressource argument. So actually

    SCRIPT_NAME  ~ argv0
    PATH_INFO      ~ argv1

in command context.

Conclusion: We should rewrite php-fpm to obey the rfc3875 CGI standard.
Having SCRIPT_NAME pointing to /something.php, must translate to


CWD is the working directory where php-fpm is started (or configured to change to).

In case of chroot CWD = "".

In any case the SCRIPT_NAME php script can be found with ./SCRIPT_NAME, from the CWD. So the undocumented not standardized SCRIPT_FILENAME should vanish! It breaks the CGI standard.
ganlvtech at qq dot com
5 months ago
php-fpm is not avaliable on Windows, but you can use IIS or Apache as the "fastcgi process manager".

If you have to use Nginx, here is a solution. Nginx provides a load balancing module. We can distribute the request to different php-cgi.exe process.


This is the origin nginx conf.
location ~ \.php$ {
    try_files  $uri = 404;
    fastcgi_index  index.php;
    include  fastcgi.conf;

You can replace it by
upstream php {

location ~ \.php$ {
    try_files  $uri = 404;
    fastcgi_pass  php;
    fastcgi_index  index.php;
    include  fastcgi.conf;


php-cgi.exe process will die after several requests, so you have to restart the php-cgi.exe manually to keep a process listening the port.

To Top