Timeout à l'exécution d'une commande via exec()

sylv38
Invité n'ayant pas de compte PHPfrance

18 mars 2015, 14:49

Bonjour,

je travaille sous Windows 2008 R2, sur lequel j'ai installé PHP 5.6.6 et Python 2.7.9.

J'ai un script PHP, tout ce qu'il y a de plus simple, que voici :
<?php
$output="";
$retval="";
$array = array();

if ( isset($_GET["message"]) )
{
    $msg = $_GET["message"];
}

$cmd = "deploy_to_server.py " . $msg;
$result = exec($cmd,$output,$retval);

if ( $retval == 1 )
{
    $array['success'] = FALSE;
    $array['result'] = $result;
}
else
{
    $array['success'] = TRUE;
    $array['result'] = $result;
}

echo json_encode($array);

?>
Le script python "deploy_to_server.py" copie les fichiers ayant les noms contenus dans "message". Ces fichiers peuvent être volumineux (environ 1Go maximum).

Lors de la première exécution de mon script PHP, j'ai eu le message :
"PHP Fatal error: Maximum execution time of 30 seconds exceeded in deploy_to_server.py ..."

J'ai donc modifier les variables dans php.ini, en ayant fait l'estimation que 5min étaient suffisantes pour la copie :
- max_execution_time = 300
- max_input_time = 300

Je n'ai plus le message d'erreur de timeout, par contre je n'ai pas le retour de mon script python ($result).

Mais si la copie prend moins de 30 secondes, j'ai le retour de mon script python.
Et à 32 secondes, je n'ai pas le retour. C'est précis.

D'où viennent ces 30 secondes qui font que j'ai ou non le retour de mon script ?
Existe-t-il une autre configuration pour PHP que j'aurai oublié ?

Sachant que dans les deux cas, mon script est exécuté en intégralité et que PHP rend la main qu'à ce moment là.

Merci
Sylvain

sylv38
Invité n'ayant pas de compte PHPfrance

18 mars 2015, 15:48

Sachant que j'ai testé également :
ini_set('max_execution_time', 0);

et

$default = ini_get('max_execution_time');
set_time_limit(1000);
//here my exec command
set_time_limit($default);

Et ça marche pas mieux.

Pour l'instant je n'ai pas inclus ce script dans mon site, je l'exécute en ligne de commande :
php-cgi.exe deploy_to_server.php message="liste fichier"

Merci
Sylvain

sylv38
Invité n'ayant pas de compte PHPfrance

18 mars 2015, 16:52

J'ai oublié d'expliquer que mon script python retourne uniquement via "print", qui va dans $result dans le script PHP, et "sys.exit(x)", qui va dans $retval dans le script PHP.

Dans n'importe quelle condition j'ai $retval à la bonne valeur. Donc je pourrai à la rigueur me baser que sur ce retour là et pas $result.

Mais j'aimerai bien tout de même avoir $result.

Désolé pour les multiples messages.

Merci
Sylvain