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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Timeout à l'exécution d'une commande via exec()

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

par sylv38 » 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

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

par sylv38 » 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

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

par sylv38 » 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