Archives pour la catégorie ‘PHP’

PHP : optimisation du cache d’opérations sur les fichiers

# vim /etc/php5/fpm/php.ini
realpath_cache_size=1M
realpath_cache_ttl=300

Pour calculer une valeur précise, le script suivant peut être utile :

# vim /var/www/check_cache.php
<?php echo realpath_cache_size();

Drupal : optimisation du bootstrap sur des scripts backend

Script initial :

# vim /var/www/test1.php
<?php

require_once './includes/bootstrap.inc';

drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

Version optimisée :

# vim /var/www/test2.php
<?php

require_once './includes/bootstrap.inc';
require_once './includes/common.inc';
require_once './includes/module.inc';

drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION); // minimal bootstrap

drupal_load('module', 'my_module');
module_invoke("my_module", "init");

L’impact au niveau du temps de chargement est conséquent :

# curl -o /dev/null -w%{time_total}\\n -s http://www.monsite.fr/test1.php
1.191
# curl -o /dev/null -w%{time_total}\\n -s http://www.monsite.fr/test2.php
0.240

PHP-FPM : effectuer un strace en live

# ps auxw | grep php | awk '{print"-p " $2}' | xargs strace

PHP : stockage des sessions en memcache

root@debian:~# apt-get install php5-memcache
root@debian:~# nano /etc/php/fpm/php.ini
session.save_handler = memcache
session.save_path = "tcp://192.168.0.10:11211?persistent=1&weight=1&timeout=1&retry_interval=15"

PHP : default_socket_timeout

Encore une connerie PHP – mais qui ne sera jamais la dernière alors soyons heureux – au niveau de la configuration par défaut du timeout des opérations réseau (lecture/écriture) que voici :

; Default timeout for socket based streams (seconds)
; http://php.net/default-socket-timeout
default_socket_timeout = 60

L’option default_socket_timeout est fixée par défaut à 60 secondes alors que la durée maximale d’exécution d’un script (option max_execution_time), est de 30 secondes…Vive la gestion des erreurs !

Bref, tout cela pour en venir au fait que 30 secondes c’est beaucoup trop et 15 suffisent largement. A noter que l’extension SOAP a un timeout spécifique pour l’établissement de la connexion.

Roundcubemail : plugin rc-vacation 0.5

La version 0.5 du plugin rc-vacation est disponible. Outre la correction de quelques bugs, un driver d’intégration avec le panel de gestion Plesk est disponible. Cette version est compatible avec la version 0.7.1 de RoundCube.

Dépôt Git : http://github.com/bhuisgen/rc-vacation
Tarball : Se détacher d'une console Xen depuis un terminal Mac OS X (un téléchargement)

PHP : gestion FastCGI avec PHP-FPM

Le port de PHP 5.3.3 est disponible ! Au programme de cette nouvelle version, l’intégration de PHP-FPM, un gestionnaire de processus PHP/FastCGI.

PHP-FPM permet de gérer plusieurs pools de processus, chacun possédant ses propres règles : gestion statique/dynamique (pour s’adapter à la charge du serveur), limites mini/maxi de processus actifs/en attente, type d’écoute par socket Unix ou TCP/IP (pour déporter l’exécution sur un serveur distinct), nombre maxi de requêtes par processus avant extinction. Le redémarrage complet du pool est également supporté en cas de crash suite à une fuite mémoire. Le recours à un outil équivalent mais limité en option, tel que spawn-fcgi n’est donc plus nécessaire (référez-vous à mes articles à son sujet : ici et ici). J’oubliais l’utilisation d’un cache de code PHP tel que APC ou Xcache est possible vu que les processus php-fpm ne sont pas détruits après chaque requête.

Je vous fais part des étapes nécessaires à sa mise en place, effectuées ici sous FreeBSD 8.1 & Nginx.

  • Configuration de PHP

Il faut s’assurer d’activer le flag de compilation de PHP-FPM :

# cd /usr/ports/lang/php5
# make config
# make install

On oublie pas l’extension de sécurité suhosin et le cache APC :

# cd /usr/ports/security/php-suhosin
# make install
# cd /usr/ports/www/pecl-APC
# make install

Une petite vérification de routine :

# php -v
PHP 5.3.3 with Suhosin-Patch (cli) (built: Aug  9 2010 21:34:21)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
 with Suhosin v0.9.32.1, Copyright (c) 2007-2010, by SektionEins GmbH
  • Configuration de PHP-FPM

Le module dispose de son propre fichier de configuration /usr/local/etc/php-fpm.conf :

[global]
pid = /var/run/php-fpm.pid
;error_log = /var/log/php-fpm.log
[www]
# socket
listen = /tmp/php-fpm.sock
listen.owner = www
listen.group = www
listen.mode = 0666
# user ID/GID
user = www
group = www
# pool
pm = dynamic
pm.max_children = 20
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 8

Est configuré un pool de processus dynamique avec un maximum de 20 processus PHP, avec écoute par socket UNIX, le tout limité au compte utilisateur du serveur web www. Le démon peut à présent être lancé :

# echo "php_fpm_enable="YES" >> /etc/rc.conf
# /usr/local/etc/rc.d/php-fpm start
Starting php_fpm.

Le pool PHP devrait être en exécution :

# su -m www
www# ps aux|grep php
www  68220  0.6  2.3 110152 48216  ??  SJ   11:56PM   0:00.95 /usr/local/sbin/php-fpm
www  68219  0.0  0.6 99912 12540  ??  IJ   11:56PM   0:00.00 /usr/local/sbin/php-fpm
www  68221  0.0  0.6 99912 12540  ??  IJ   11:56PM   0:00.00 /usr/local/sbin/php-fpm
www  68222  0.0  0.6 99912 12540  ??  IJ   11:56PM   0:00.00 /usr/local/sbin/php-fpm
www  68223  0.0  0.6 99912 12540  ??  IJ   11:56PM   0:00.00 /usr/local/sbin/php-fpm
www  68224  0.0  0.6 99912 12540  ??  IJ   11:56PM   0:00.00 /usr/local/sbin/php-fpm
www  68225  0.0  0.6 99912 12540  ??  IJ   11:56PM   0:00.00 /usr/local/sbin/php-fpm
www  68226  0.0  0.6 99912 12540  ??  IJ   11:56PM   0:00.00 /usr/local/sbin/php-fpm
www  68402  0.0  0.1  9092  1172   1  R+J  12:00AM   0:00.00 grep php
  • Configuration de Nginx

Le module FastCGI doit être configuré pour utiliser le pool. J’utilise pour ce faire un fragment de configuration que j’inclue dans chaque vhost où PHP est nécessaire :

# cd /usr/local/etc/nginx/
# more fragments/php.conf
fastcgi_pass   unix:/tmp/php-fpm.sock;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME    $request_filename;
include        fastcgi_params;

Le nom et le type de socket doit correspondre ici à ce qui a été déclaré dans la configuration de PHP-FPM.

# more vhosts/site_fr.conf
server {
 listen 172.16.0.5:80;
 server_name www.site.fr;
 root /usr/local/www/site.fr/www/html;
 index index.php;

 location ~ \.php$ {
  include fragments/php.conf;
 }
}

Nginx peut enfin être redémarré  :

# /usr/local/etc/rc.d/nginx restart
Performing sanity check on nginx configuration:
the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
configuration file /usr/local/etc/nginx/nginx.conf test is successful
Stopping nginx.
Waiting for PIDS: 89603.
Performing sanity check on nginx configuration:
the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
configuration file /usr/local/etc/nginx/nginx.conf test is successful
Starting nginx.

L’exécution des scripts PHP est à présent assurée par le pool PHP-FPM.

Haut de page