Forum Programmation.php system() bloque l'accès web

Posté par  .
Étiquettes :
1
20
juil.
2010
Cher forum (voui, c'est encore moi),

Je rencontre un problème avec PHP et/ou Apache en utilisant la fonction system().

Mon but est de lancer des pings vers un hôte et que le résultat de ces pings soient affichés en temps réel pour les utilisateurs.

Mon problème est que la fonction system() bloque l'accès au reste du site web au sein du navigateur (dans un nouvel onglet par exemple) tant que l'exécution de la commande n'est pas fini. l'accès depuis un autre navigateur depuis le même poste reste possible.

Voici un exemple du code PHP :
$cmd="ping -s 1024 -c 100 127.0.0.1 &";
system($cmd);


Je suis sous Debian Lenny avec les paquets suivants :
~$ dpkg -l *php* | grep "^ii"
ii libapache2-mod-php5 5.2.6.dfsg.1-1+lenny8 server-side, HTML-embedded scripting languag
ii php5-common 5.2.6.dfsg.1-1+lenny8 Common files for packages built from the php
~$ dpkg -l *apach* | grep "^ii"
ii apache2 2.2.9-10+lenny8 Apache HTTP Server metapackage
ii apache2-doc 2.2.9-10+lenny8 Apache HTTP Server documentation
ii apache2-mpm-prefork 2.2.9-10+lenny8 Apache HTTP Server - traditional non-threade
ii apache2-utils 2.2.9-10+lenny8 utility programs for webservers
ii apache2.2-common 2.2.9-10+lenny8 Apache HTTP Server common files
ii libapache2-mod-perl2 2.0.4-5+lenny1 Integration of perl with the Apache2 web ser
ii libapache2-mod-php5 5.2.6.dfsg.1-1+lenny8 server-side, HTML-embedded scripting languag
ii libapache2-mod-python 3.3.1-7 Python-embedding module for Apache 2
  • # SESSION ?

    Posté par  . Évalué à 4.

    Si tu utilises les sessions, l'appel de la deuxième page attends que la première ait fermée la session pour s'exécuter.
    Il faut utiliser la fonction session_write_close() des que tu n'as plus besoin de la session sur la première page, la deuxième pour alors s'exécuter.

    ps (vie ma vie) : solution que j'ai découvert tout récemment et très difficile à trouver sur le net (va savoir si c'est apache, php, le navigateur ou autre chose qui coince)
    • [^] # Re: SESSION ?

      Posté par  . Évalué à 3.

      Je me doutais que c'était un truc comme ça, et effectivement c'est impossible à trouver sur le net...
      Je viens de tester et ça a l'air de fonctionner :
      $cmd="ping -s 1024 -c 100 127.0.0.1 &";
      session_write_close();
      system($cmd);


      MERCI beaucoup.
      • [^] # Re: SESSION ?

        Posté par  . Évalué à 2.

        En fait c'est très bien expliqué dans la doc, mais il faut déjà connaitre la fonction ....

        Les données de session sont généralement stockées à la fin de votre script, automatiquement, sans besoin d'appeler explicitement session_write_close(). Mais durant toute l'exécution du script, les données de session sont verrouillées en écriture, et un seul script peut opérer sur la session en même temps. Lorsque vous utilisez des frames avec des sessions, vous vous en rendrez compte en voyant les frames se rafraîchir les uns après les autres. Vous pouvez réduire le temps de calcul de ces pages en refermant la session aussitôt que possible, ce qui libère les données pour les autres scripts.

        http://fr2.php.net/manual/fr/function.session-write-close.ph(...)
        • [^] # Re: SESSION ?

          Posté par  . Évalué à 2.

          Ben on en apprend tous les jours, je connaissais pas non plus. M'en vais tester ça.
      • [^] # Re: SESSION ?

        Posté par  . Évalué à 2.

        c'est quoi l'interet de se pinguer soi meme via un appel systeme en php ?
        • [^] # Re: SESSION ?

          Posté par  (site web personnel) . Évalué à 2.

          Un test unitaire ? une reproduction du problème plutôt !
          Et tant qu'à faire autant tester sur le loopback qui a tendance à répondre tout le temps _ s'il est monté...

          Fuse : j'en Use et Abuse !

        • [^] # Re: SESSION ?

          Posté par  . Évalué à 1.

          Le ping du loopback, c'est juste pour l'exemple et la mise en évidence du problème qui n'est pas lié à la commande ping.
          Le but réel est d'effectuer des pings vers divers hôtes pour aider au diagnostic lors de problèmes réseaux.
          En tout cas, la solution proposée fonctionne.
          Ma vie : Moi qui ne suis pas dev, ce n'était pas évident de trouver et comprendre ce genre de problème, merci encore à Zeds.

Suivre le flux des commentaires

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