Forum Programmation.php Pipe + Apache + PHP

Posté par (page perso) .
Tags : aucun
0
22
nov.
2009
Bonjour à tous,

La question que j'ai est un peu technique... Ne sachant pas trop où la poser, je la met ici, même si elle concerne plus Apache, à mon avis.
Voici mon problème:

J'ai un exécutable que je lance depuis mon script PHP à l'aide d'un:
exec("/usr/bin/appli --pipe=/tmp/monpipe &");

Comme vous pouvez le voir, je lui passe un pipe qui me permet de la commander depuis une application externe (ici, en l'occurrence, c'est pour garder la main dessus, malgré les diverses requêtes). J'aurais créer ce pipe préalablement avec :
posix_mkfifo('/tmp/monpipe', 0777);

Ensuite, au requêtes suivantes, j'essaye d'arrêter mon application en lui envoyant une commande:
exec("echo quit > /tmp/monpipe");

Et là, ça ne marche pas, quand elle est exécuté depuis apache.
Quand je lance en utilisateur:
$ /usr/bin/appli --pipe=/tmp/monpipe &
$ echo quit > /tmp/monpipe


Elle se lance et s'arrête sans soucis.
Quand je lance les scripts PHP sans apache:
$ php launch_appli.php
$ php quit_appli.php


Elle se lance et s'arrête sans soucis, également.

Mais quand je les exécutes depuis apache, l'application s'exécute bien, et tourne dans les taches. Mais pour l'arrêt, c'est comme si l'application n'avait jamais pris le pipe. L'arrêt depuis apache coince, ainsi que:
$ php quit_appli.php

Ça coince.
$ echo quit > /tmp/monpipe

Ça coince aussi (aucune réponse). C'est ce que ça fait lorsque que lance cette commande sans avoir d'application en écoute de l'autre coté.

Donc, par déduction, ce doit être une sécurité de apache quelque part en empêche de genre de chose. Mais toute mes recherches sont restés infructueuses.
Si quelqu'un à une idée là dessus, je suis preneur (je planche sur ce problème depuis plusieurs mois)

Merci beaucoup
Snark.
  • # cli or not

    Posté par (page perso) . Évalué à 1.

    A mon avis php en mode cli différe du module php d'apache d'un point de vue sécurité.
    Essaie de ce côté.

    Système - Réseau - Sécurité Open Source

    • [^] # Re: cli or not

      Posté par (page perso) . Évalué à 2.

      J'avais déjà regardé de ce coté là, mais il n'y a rien concernant la sécurité dans les différences :
      $ diff /etc/php5/apache2/php.ini /etc/php5/cli/php.ini
      83c83
      < short_open_tag = On
      ---
      > short_open_tag = Off
      270c270
      < memory_limit = 32M ; Maximum amount of memory a script may consume (16MB)
      ---
      > memory_limit = 128M ; Maximum amount of memory a script may consume (32MB)
      451c451
      < post_max_size = 8M
      ---
      > post_max_size = 32M
  • # nohup

    Posté par (page perso) . Évalué à 2.

    Jusqu'à preuve du contraire, ton /usr/bin/appli est tué lorsqu'apache+php ont terminé le travail sur cette requête.

    Fais un essai avec exec("nohup /usr/bin/appli --pipe=/tmp/monpipe");
    • [^] # Re: nohup

      Posté par (page perso) . Évalué à 2.

      Non, l'application est bien exécute en détaché, et le processus est toujours actif à la fin de la requête. Si je lance une musique avec mplayer, sur lequel je pipe une entrée de commande, j'arrive à le lancer correctement. Il tourne bien en tache de fond, mais pas moyen de l'arreter si je lui envoie une commande (et qu'il a été lancé depuis apache).
  • # shell

    Posté par (page perso) . Évalué à 3.

    Démarre Apache avec "strace -f -e open" et tu verras si ton appli essai d'ouvrir /tmp/monpipe et, si oui, pourquoi ça ne marche pas. Je suspecte un problème de SELinux.

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

  • # pistes

    Posté par (page perso) . Évalué à 3.

    Quelques pistes :

    * As-tu simplement testé de lancé les scripts en ligne de commande depuis le même compte qu'apache ? (www-data ou autre)

    * remarque concernant le code "un exec" pour un echo dans un pipe !, un peu "bourrin" non ;) ? ,

    * quand tu dis "n'avais jamais pris le pipe", as-tu testé les codes retours des open/read etc du pipe ?

    A+

    Nicolas
  • # proc_open

    Posté par . Évalué à 1.

    Essaye d'utiliser proc_open, il semble mieux adapter aux pipe.

    http://php.net/manual/fr/function.proc-open.php

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.