OVH Cloud OVH Cloud

Apache et windows->recuperer sortie com mande exec()

6 réponses
Avatar
Thierry B.
Bonjour,

j'ai un petit problème avec un script que j'essaie d'utiliser sur
windows qui utilise la commande exec('commande', $retour). Sous Windows,
$retour est toujour vide. Par exemple un simple

>exec('netstat', $retour);
>echo $retour;

$retour est un tableau, mais toujours vide.

--
Thierry B.
"Bon, je vais aller péter ailleurs" (mon fils, 6 ans)

6 réponses

Avatar
Olivier Miakinen

j'ai un petit problème avec un script que j'essaie d'utiliser sur
windows qui utilise la commande exec('commande', $retour). Sous Windows,
$retour est toujour vide. Par exemple un simple

exec('netstat', $retour);
echo $retour;


$retour est un tableau, mais toujours vide.


Peut-être que le PATH (chemin d'accès aux commandes) n'est pas configuré
de la même manière en interactif et depuis un script PHP, et que du coup
il ne trouve pas la commande ?

Quelques idées pour progresser dans le diagnostic :

- au lieu d'appeler la commande netstat, appelle un script (ou batch) ou
bien une commande très longue, afin de voir si la commande est bien
appelée ;

- récupérer le 3e paramètre de la fonction exec() (return_var) ;

- essayer avec passthru().

--
Olivier Miakinen
Aidez Saburi à rester près de sa famille et poursuivre ses études
en France, signez la pétition :
<http://www.fcpe94.ouvaton.org/article_petition.php3?id_article=9>


Avatar
Thierry B.

Peut-être que le PATH (chemin d'accès aux commandes) n'est pas configuré
de la même manière en interactif et depuis un script PHP, et que du coup
il ne trouve pas la commande ?

Quelques idées pour progresser dans le diagnostic :

- au lieu d'appeler la commande netstat, appelle un script (ou batch) ou
bien une commande très longue, afin de voir si la commande est bien
appelée ;

- récupérer le 3e paramètre de la fonction exec() (return_var) ;

- essayer avec passthru().



OK,

merci pour les pistes. J'ai cerné le problème, sans déterminer la cause.
Ce n'est pas un problème de path , j'ai essayé le chemin direct aussi.
J'ai essayé system, exec, passthru. Apparemment rien n'y fait, cela
dépend du programme lancé (Dans mon exemple, il y a une erreur,
'netstat' est en fait un des cas qui marchent).

exemple sous dos, je prend n'importe quel exécutable :
C:utilhardlink.exe


Sortie :
Hardlink - JCB © 2000
==================== > Syntaxe :
---------
hardlink <chemin_reel> <nom_du_lien>

<chemin_reel> : le nom du fichier ou dossier
pour lequel on veut créer un lien
<nom_du_lien> : l'emplacement du lien


en php :

exec('C:utilhardlink.exe', $output);
print_r($output);

Sortie :
Hardlink - JCB ¸ 2000 ===================== Syntaxe : --------- hardlink : le nom du fichier ou dossier pour lequel on veut cr‚er un lien : l'emplacement du lien 1


Cà marche. Je prend un autre programme, en l'occurence celui dont je
veux me servir, mais j'en ai trouvé d'autres dans ce cas :

Sous Dos:
c:cvsrlog.exe


Sortie (juste la première ligne ..) :
Usage: cvs rcsfile [-lRhtNb] [-r[revisions]] [-d dates] [-s states]


en php :

exec('C:cvsrlog.exe', $output);
print_r($output);

Sortie :
Array ( )


??? Et apparemment c'est comme cela pour plein de programmes DOS. Pour
certain la sortie est récupérée en PHP, pour d'autre non.

Détail intéressant, si je lance ces même commandes en interactif :

phpcli test.php


test.php contenant les commandes exec et print, j'ai d'abord la sortie
de la commande 'rlog.exe', donc elle est bien éxécutée, puis après :
Array ( )
donc il n'a pas pu récupérer la sortie. Je me demande si quelque chose

dans les binaires DOS, la fàçon dont ils ont été compilé ou la fàcon
dont les sorties sont gérées, j'en sais rien, n'influe pas sur la
capacité de PHP sous windows a récupérer 'stdout'.

Quand au code de retour de la commande passtru , je ne sais pas trop
quoi en penser. Dans l'exemple précédent, si je remplace exec par
passthru, j'ai -1, ce qui voudrai dire que la commande n'a pas été
exécutée (?), mais lancé en interactif j'ai 1, ce qui voufrait dire que
çà a marché. Mais pourtant en interactif avec exec $output restait vide.
De plus avec netstat le code de retour est 0, ce qui pour moi représente
false, alors que la commande a réussi. A moins que çà ne soit bien
exploité que sous Unix ?

Avatar
Olivier Miakinen

Sous Dos:
c:cvsrlog.exe


Sortie (juste la première ligne ..) :
Usage: cvs rcsfile [-lRhtNb] [-r[revisions]] [-d dates] [-s states]


en php :

exec('C:cvsrlog.exe', $output);
print_r($output);

Sortie :
Array ( )


??? Et apparemment c'est comme cela pour plein de programmes DOS. Pour
certain la sortie est récupérée en PHP, pour d'autre non.


C'est peut-être alors la différence entre stdout et stderr. La commande
exec ne semble pas fournir le moyen de récupérer séparément le flux de
sortie et le flux d'erreur.

Essaye ceci (syntaxe Unix, je ne sais pas si cela marche pour DOS) :
exec('C:cvsrlog.exe 2>&1', $output);
print_r($output);

Tu peux aussi tenter :
exec('C:cvsrlog.exe >stdout.txt 2>stderr.txt');
puis regarder le contenu des fichiers stdout.txt et stderr.txt

--
Olivier Miakinen
Aidez Saburi à rester près de sa famille et poursuivre ses études
en France, signez la pétition :
<http://www.fcpe94.ouvaton.org/article_petition.php3?id_article=9>


Avatar
Thierry B.

Sous Dos:
c:cvsrlog.exe


Sortie (juste la première ligne ..) :

Usage: cvs rcsfile [-lRhtNb] [-r[revisions]] [-d dates] [-s states]


en php :

exec('C:cvsrlog.exe', $output);
print_r($output);

Sortie :

Array ( )


??? Et apparemment c'est comme cela pour plein de programmes DOS. Pour
certain la sortie est récupérée en PHP, pour d'autre non.



C'est peut-être alors la différence entre stdout et stderr. La commande
exec ne semble pas fournir le moyen de récupérer séparément le flux de
sortie et le flux d'erreur.

Essaye ceci (syntaxe Unix, je ne sais pas si cela marche pour DOS) :
exec('C:cvsrlog.exe 2>&1', $output);
print_r($output);

Tu peux aussi tenter :
exec('C:cvsrlog.exe >stdout.txt 2>stderr.txt');
puis regarder le contenu des fichiers stdout.txt et stderr.txt



Je crois que je viens de trouver "malheureusement" la solution, passer à
Apache 2 (à essayer) :

Bug #26657 exec() strange behaviour :
http://bugs.php.net/bug.php?id&657



Avatar
Thierry B.


Je crois que je viens de trouver "malheureusement" la solution, passer à
Apache 2 (à essayer) :

Bug #26657 exec() strange behaviour :
http://bugs.php.net/bug.php?id&657


Je suis maudit. Testé sur Apache 2.0.55 et php 4.3.11 en module ou cgi,
marche pas non plus.

Avatar
Thierry B.


Je crois que je viens de trouver "malheureusement" la solution, passer
à Apache 2 (à essayer) :

Bug #26657 exec() strange behaviour :
http://bugs.php.net/bug.php?id&657



Je suis maudit. Testé sur Apache 2.0.55 et php 4.3.11 en module ou cgi,
marche pas non plus.


Yargla, CA MARCHE ENFIN !

C'était bien un problème venant de PHP (version 4.3.11 que j'utilisai).
Je suis passé en 5.0.5 et maintenant tout marche. OUF !