Nous avons récemment migré vers PHP-FPM. Cependant, nous avons rencontré un problème avec certains scripts de longue durée. Le code ressemble à peu près à:
foreach ($items as $item) {
set_time_limit(30);
proccessThatTakesAround2secs();
}
La limite de temps normale du script PHP est également de 30 secondes. Cela fonctionnait auparavant correctement en ce sens que nous réinitialisons la limite de temps restante à 30 secondes pour chaque élément. Il y a environ 1000 éléments signifiant le script dans le total prendrait normalement environ 30 minutes à compléter. Cependant, nous avons depuis lors atteint le problème suivant:
FastCGI: communication avec le serveur "/usr/local/php-5.6.24/sbin/php5-fpm" abandonné: délai d'inactivité (30 sec)
Maintenant, ma question est, est-il judicieux d'augmenter le délai d'inactivité à quelque chose comme une heure tout en s'assurant que les scripts PHP ne s'exécutent pas plus de 30 secondes, sauf si nous utilisons set_time_limit
? Existe-t-il un moyen de définir le délai d'inactivité par script (quelque chose qui ressemble à un set_time_limit
?)
Voici notre configuration de piscine:
[www]
user = www-data
group = www-data
listen = /var/run/php5-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = static
pm.max_children = 55
pm.max_requests = 10000
php_value[memory_limit] = 128M
php_value[max_execution_time] = 30
php_value[upload_max_filesize] = 20M
php_value[post_max_size] = 20M
php_value[max_input_vars] = 9999
Et voici notre fastcgi.conf
<IfModule mod_fastcgi.c>
AddType application/x-httpd-fastphp5 .php
Action application/x-httpd-fastphp5 /php5-fcgi
Alias /php5-fcgi /usr/local/php-5.6.24/sbin/php5-fpm
FastCgiExternalServer /usr/local/php-5.6.24/sbin/php5-fpm -socket /var/run/php5-fpm.sock -idle-timeout 30 -pass-header Authorization
<Directory /usr/local/php-5.6.24/sbin/>
Require all granted
</Directory>
</IfModule>
Je me suis retrouvé dans une situation similaire avec des processus longs et php-fpm et fastcgi lors de la migration de mod_php.
L'erreur que vous voyez vient du proxy fastcgi d'Apache qui a tué la connexion au pool php-fpm parce que votre script n'a rien sorti pendant 30 secondes.
Vous pouvez modifier le délai d'inactivité dans votre configuration Apache pour l'étendre (ne peut pas être 0):
FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi -socket /run/php/php7.0-fpm.sock -idle-timeout 1800 -pass-header Authorization
La chaîne se présente comme suit: Apache -> proxy FastCgiExternalServer -> serveur de pool php-fpm -> processus php
Le proxy Apache tue la connexion à php, donc définir max_execution_time ou set_time_limit à partir de php n'a pas d'importance.
AFAIK si php est exécuté sur Apache via mod_fastcgi, il n'y a aucun moyen de définir des limites de temps par script à partir du code php ou .user.ini ou via Apache (.htaccess). Cela signifie donc qu'en l'étendant à un endroit, vous prolongez le délai d'expiration, par exemple. vos utilisateurs frontend et backend. Alternativement, vous pouvez le séparer via 2 vhosts et y définir différentes valeurs de timeout.
Bien que cela ne corresponde pas nécessairement à la configuration de l'OP, la plupart des gens vont exécuter PHP-FPM sous un paramètre proxy. En tant que tel, vous pouvez définir le délai d'attente pour une configuration de proxy comme ceci (c'est mon php.conf
)
<Proxy "fcgi://127.0.0.1:9000">
ProxySet timeout=300
</Proxy>
<FilesMatch \.php$>
SetHandler application/x-httpd-php
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
Si vous utilisez un .sock
fichier à la place, remplacez simplement les deux instances de fcgi://127.0.0.1:9000
avec la commande pour utiliser le fichier chaussette