IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Système] fonction system(), les valeurs sans retours


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut [Système] fonction system(), les valeurs sans retours
    Bonjour,

    Je me pose des questions quand aux fonctions sytem() (j'en ai teste tous les dérivés, mais le comportement est le même).

    Je teste mon script sur easyPhp sur une station Windows.

    Lorsque je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    system("mkdir youpi");
    Je n'ai aucune valeur de retour, et pour cause, Windows crée le dossier sans soucis et ne renvoi rien ... tout va bien.

    Lorsque je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    system("salut les copains");
    Je n'ai encore une fois aucune valeur de retour ... alors que j'aimerai tellement avoir une erreur ... Je ne sais pas pourquoi PHP me la zappe, il ne me renvoi pas l'erreur du shell ... peut-être par sécurité ...

    Ca me traumatise ce comportement, avoir le même resultat pour une commande qui fonctionne et pour une qui ne fonctionne pas, ça me scie ...

    Avez vous une idée pour récupérer une erreur du shell ...?

    Pour info, j'ai egalement teste avec :
    exec(), passthru(),shell_exec() et c'est pareil...
    Les valeurs de retour de la fonction system() sont :
    Pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $fonction = system("youpi youpla",$retour)
    ET
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $fonction = system("mkdir youpi",$retour)
    fonction :
    retour : 1

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Quand tu utilise cette fonction, c'est la valeur de $retour qui te donne le résultat de exécution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $fonction = system("youpi youpla",$retour);
     
    echo $retour
    si $retour vaut 0, alors c'est OK, si c'est un autre chiffre, cela n'est pas bon.

  3. #3
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    tu peux également écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $commande = "n'importe quoi";
    $fichierDeSauvegarde = "log.txt";
    system($commande." > ".$fichierDeSauvegarde);
    tu auras tous tes retours dans le fichier .txt (pratique si tu affiches un commentaire pour chaque requete effectuée, il te suffit apres de lire ton TXT pour etre certain tout était OK)

  4. #4
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    si $retour vaut 0, alors c'est OK, si c'est un autre chiffre, cela n'est pas bon.
    En effet, je n'avais pas fait attention au fait que je créais un dossier portant le même nom, donc erreur ... Me voila rassure, le comportement n'est pas le même ^^. Ça m'aurai cependant intéressé d'avoir cette erreur écrite quelque part.

    tu auras tous tes retours dans le fichier .txt
    Et non, pas la sortie des erreurs ... (ce qui doit expliquer dans une certaine mesure pourquoi php ne les trouve pas). Même dans la console directement, lorsqu'une erreur apparait, il ne redirige pas le flux vers le fichier de sortie ... mais redirige un flux vide ...

    Il persiste egalement un probleme d'encodage des caractères sur la sortie. Je n'ai pu que tester avec les fonction utf8_encode()/_decode(), mais la console Windows ne renvoi de toute évidence pas de flux en utf-8 ... ^^

    Existe-t-il d'autres fonctions permettant de remettre de l'ordre dans les caractères ?

  5. #5
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    Citation Envoyé par keaton7 Voir le message
    Et non, pas la sortie des erreurs ... (ce qui doit expliquer dans une certaine mesure pourquoi php ne les trouve pas). Même dans la console directement, lorsqu'une erreur apparait, il ne redirige pas le flux vers le fichier de sortie ... mais redirige un flux vide ...
    En effet, je suis allé trop vite mais l'utilisation de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    exec($cmd, $out, $e);
    if ($e) {
        echo $e;
    }
    ne pourrait pas régler ton problème ?

  6. #6
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    mais l'utilisation de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    exec($cmd, $out, $e);
    if ($e) {
        echo $e;
    }
    Dans ce cas, puisque le retour d'un exec est dans le $out, et que 0 signifie que il n'y a pas eu d'erreurs, le code serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    exec($cmd, $out, $e);
    if (!$e) {
        echo implode('<br />',$out);
    }
    Mais les erreurs ne sont toujours pas redirigées ... C'est pénible parce que toutes les erreurs ne se valent pas, par exemple : Un sous-répertoire ou un fichier youpi existe déjà. et 'youpi' n'est pas reconnu en tant que commande interne ou externe, un programme exécutable ou un fichier de commandes. ne devraient pas renvoyer le même code d'erreur .., parce que c'est tout a fait différent, c'est pourquoi je ne suis pas fan de l'idée du : } else { print "erreur"; ...

    Je suis tout a fait conscient que sous Unix, la redirection des erreurs est beaucoup plus avancée, et la technique du &> devrait être parfaite, mais je n'ai pas franchement envie de commencer a sélectionner les plates formes compatibles, juste a cause d'un retour d'erreur d'une fonction PHP sous Windows ...

    Pas d'idée sinon pour l'encodage de caractères ?

    (Célébrons mon 500eme message , en tous cas merci déjà pour vos suggestions)

  7. #7
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Pas d'idée d'autre idées ? Pour le retour d'erreur du shell Windows ? Pour l'encodage de la sortie ?

  8. #8
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    et biiien... je te dirais que perso, en général je fais toutes mes vérifications AVANT l'execution de la commande... et la seule erreur qui pourrait m'etre retournée c'est par exemple comme la derniere fois : oublier de restart Apache après l'install d'ImageMagick... normalement, tu n'es pas sensé avoir d'erreur en ligne de commande :s

  9. #9
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut


    J'aurai du commencer par la : je développe une petite interface de console pour avoir la main sur le shell de mon serveur mutualise duquel je ne peux pas accéder en SSH, mon offre ne le permettant pas (je vous filerai le code si ça vous intéresse quand ce sera fini). Du coup, je feinte par des commandes system. Je me vois mal m'amuser a prévoir TOUTES les commandes, alors que mon appli n'est censé être qu'une interface, un pont tout a fait intègre .

  10. #10
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    alors là je sèche completely du coup... désolé

  11. #11
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    try{
        exec($cmd, $out, $e);
    }catch (Exception $e){
        echo $e->getMessage();
    }

  12. #12
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try{
        exec($cmd, $out, $e);
    }catch (Exception $e){
        echo $e->getMessage();
    }
    Ce code ne m'affiche strictement rien ...

  13. #13
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    le problème c'est que "$e" ne retourne qu'un code d'erreur... pas de message

    si vraiment tu as un message d'erreur, genre :

    Warning : parse error at blablabla.php line x
    ne serait-il pas écrit dans log.txt ?? (j'suis pas très doué en shell, mais je sais que je récup des infos dans ce fichier (le buffer en gros) apres il faudrait le parser (supayyyr :s))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec($cmd." > log.txt", $out, $e)

  14. #14
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Warning : parse error at blablabla.php line x
    C'est une erreur de type PHP, ce n'est pas ce genre de message que je cherche a voir, mais ceux de la console ... Mais l'exception aurait tendance a recevoir l'erreur du exec de toute façon non ? comment pourrait-elle être une solution ?

  15. #15
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    ok... mais effectivement... le mode shell ne retourne aucune erreur à ma connaissance (si ce n'est un code erreur différent de 0)

    je fais mes petits tests avec ce script [TRÈS rudimentaire] pour le moment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?php
    if (!empty($_POST['cmd'])) {
    	$cmd = $_POST['cmd'];
    	try{
    		exec($cmd, $out, $e);
    	}catch (Exception $e){
    		echo $e->getMessage();
    	}
    	echo "<pre>";
    	print_r($out);
    	print_r($e);
    	echo "<pre>";
    }
    ?>
    <form method="post" action="">
    	<input type="text" name="cmd" value="<?php echo $_POST['cmd']; ?>" />
    	<input type="submit" />
    </form>
    en envoyant "cmd" dans l'input, je récupère bien
    Array
    (
    [0] => Microsoft Windows [version 6.0.6002]
    [1] => Copyright (c) 2006 Microsoft Corporation. Tous droits r‚serv‚s.
    [2] =>
    [3] => D:\Sites\tests>
    )
    0
    mais si je met par exemple "blabla", tout ce que j'ai c'est un array() (vide) et un code d'erreur 1

  16. #16
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    On en est au même point alors Je commence a croire qu'on a fait le tour de la question ...

    Une petite idée sur l'encodage de caractères ?

  17. #17
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    Citation Envoyé par keaton7 Voir le message
    On en est au même point alors Je commence a croire qu'on a fait le tour de la question ...

    Une petite idée sur l'encodage de caractères ?
    J'AI TROUVE POUR L'ENCODAAAAAAAGE !!!!!!!!!


    pfiouuu quelle galère n'empeche... j'ai du aller voir du côté de discussion en Python pour trouver l'encodage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?php
    header('Content-Type: text/html; charset=cp850');
    ?>
    <form method="post" action="">
    	<input type="text" name="cmd" value="<?php echo $_POST['cmd']; ?>" />
    	<input type="submit" />
    </form>
    <?php
    if (!empty($_POST['cmd'])) {
    	$cmd = $_POST['cmd'];
    	exec($cmd, $out, $e);
    	if (!$e) {
    		// Affichage
    		echo "<pre>";
    		print_r(array_map('htmlentities', $out));
    		echo "</pre>";
    	} else {
    		echo "ERROR";
    	}
    }
    ?>
    Petit test en post "dir" et ça marche nickel

    Encodage en : cp850


    EDIT : bon d'accord c'est pas grand chose... mais tellement de galère pour tes 2 problèmes que j'suis déjà bien content

  18. #18
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Merci, je vais tester ca dans la journee

  19. #19
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Toutes mes félicitations pour l'encodage, fini les points d'interrogation ^^.

    Merci beaucoup pour ton investissement.

Discussions similaires

  1. Réponses: 9
    Dernier message: 11/11/2007, 11h40
  2. [DOM] Fonctions "imbriquées" et valeur de retour
    Par hush dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 19/04/2007, 16h16
  3. question sur les valeurs de retour
    Par arasium dans le forum Langage
    Réponses: 10
    Dernier message: 24/07/2006, 16h47
  4. Tester les valeurs de retour de ADsOpenObject
    Par Menontona dans le forum Windows
    Réponses: 1
    Dernier message: 31/05/2006, 16h17
  5. [Système] fonction system et exécutable
    Par Luffy Duck dans le forum Langage
    Réponses: 5
    Dernier message: 03/01/2006, 17h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo