web-dev-qa-db-fra.com

Augmenter le paramètre de délai d'inactivité PHP-FPM

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>
9
apokryfos

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.

23
seven

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

7
Machavity