php-fpm

php-fpm-logo.gif

Voilà quelques semaines que la version 5.3.3 de php est sortie avec comme belle nouveauté php-fpm .
Au risque de répéter la doc officielle , php-fpm est :

  • FPM permet notamment de faire tourner plusieurs VHosts avec un UID/GID différent et des PHP.ini différents.
  • Support de l'upload accéléré
  • Statistiques de base (similaire au module mod_status d'Apache)
  • Redémarrage de secours en cas de destruction accidentelle du cache opcode, lors de l'utilisation d'un accélérateur de code PHP
  • Amélioration de la gestion des processus en cas de graceful stop/start
  • Journalisation des scripts lents
  • Journalisation de stdout et stderr
  • fastcgi_finish_request() une fonction spéciale pour clôturer la connection avec le client, mais continuer un traitement php/

Installation

A partir de php 5.3.3 , les sources de php-fpm sont intégrés au core , il vous suffit dont d'ajouter le paramètre --enable-fpm à la compilation , voici donc un exemple de fichier de configuration à la compilation :

#!/bin/sh

export OPTIM=-02
./configure --prefix=/usr/local \
        --enable-fpm
        --with-xsl \
        --enable-soap \
        --with-gettext \
        --enable-mbstring --with-mbstring=all \
        --disable-debug \
        --enable-memory-limit \
        --enable-ftp \
        --with-mcrypt \
        --enable-zip \
        --enable-calendar \
        --enable-exif \
        --enable-pdo \
        --with-pdo-mysql \
        --with-mysql \
        --with-pdo-sqlite \
        --with-sqlite \
        --with-zlib \
        --with-jpeg-dir \
        --with-gd \
        --with-freetype-dir=DIR \
        --with-imap-ssl \
        --with-kerberos \
        --with-imap \
        --with-curl \
        --enable-bcmath \

Le seul impératif , est d'avoir le paquet libevent en version 1.4.11 minimum .
En cas de besoin voici les sources de cette lib : http://packages.debian.org/source/sid/libevent

Un simple

./configure
make
make install

fera l'affaire.

Configuration

Une fois l'installation de php terminée il vous faudra faire quelques petits réglages de base pour le bon fonctionnement .
nous allons commencer par editer le fichier de configuration par defaut de php-pfm

cp /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf
vim /usr/local/etc/php-fpm.conf

J'ai pour habitude de tester avec les paramètres par défauts , puis d'adapter en fonction de mes besoins , voici donc la liste des paramètres à décommenter ( si ce n'est déjà fait ) , chez moi le groupe et l'utilisateur qui lance les process php sont www-data , à adapter dans votre cas , il est conseillé de mettre un utilisateur sans pouvoir .


  • pid = /usr/local/var/run/php-fpm.pid
  • error_log = /usr/local/var/log/php-fpm.log
  • listen.allowed_clients = 127.0.0.1
  • user = www-data
  • group = www-data
  • pm = dynamic
  • pm.max_children = 50
  • pm.start_servers = 20
  • pm.min_spare_servers = 5
  • pm.max_spare_servers = 35
  • pm.max_requests = 500

Voilà pour le fichier de configuration .

Démarrage automatique

Nous allons mettre l'exécutable dans le répertoire init.d afin qu'il lance automatiquement php-fpm au démarrage du serveur .

cd /etc/init.d
vim php-fpm

Voici le contenu .. très ... basique mais fonctionnel :)

#!/bin/bash

start() {
      echo -n "Starting PHP-FPM: "
            /usr/local/sbin/php-fpm
}
stop() {
      echo -n "Stopping PHP-FPM: "
      killall -9 php-fpm
}

case "$1" in
    start)
          start
    ;;
    stop)
          stop
    ;;
    restart)
          stop
          start
    ;;
    *)
          echo "Usage: php-fpm {start|stop|restart}"
          exit 1
    ;;
esac
exit 0

Enfin , la commande pour le lancement au démarrage du serveur

chmod 777 /etc/init.d/php-fpm
update-rc.d php-fpm defaults

On peu maintenant lancer la bête , par un simple appel à : php-fpm

/etc/init.d/php-fpm start

Si tout se passe correctement vous ne devriez avoir aucun message d'erreur , et une série de process se mettent à l'écoute sur le port 9000 par défaut .
Je vous laisse explorer la doc pour affiner vos réglages et aller plus loin quand à la virtualisation d'hôtes .
Utiliser php-fpm avec Nginx semble donc maintenant évident .. voilà qui va nous simplifier la vie , plus particulièrement à cette étape : liaison php - nginx

Avec apache:

Merci à Stealth35

pour ceux qui voudraient tester sur apache voilà le code à ajouter dans votre configuration httpd.conf ou dans vos vhost si vous en utilisez:

<Location "/php-fpm">

Order Deny,Allow Deny from All Allow from ENV=REDIRECT_STATUS
</Location>

FastCgiExternalServer /php-fpm-handler -host 127.0.0.1:9000
AddType application/x-httpd-php .php
Action application/x-httpd-php /php-fpm
ScriptAlias /php-fpm /php-fpm-handler