2009-06-21 4 views
3

J'ai un serveur Python qui fonctionne enfin et qui répond à plusieurs commandes avec les sorties, mais j'ai maintenant des problèmes avec PHP qui reçoit la sortie complète. J'ai essayé des commandes telles que fgets, fread, la seule commande qui semble fonctionner est "fgets".Boucle Fget avec fsockopen dans PHP 5.x

Cependant, cela ne années recieve sur la ligne de données, je puis créé une déclaration while affichée ci-dessous:

while (!feof($handle)) { 
    $buffer = fgets($handle, 4096); 
    echo $buffer; 
} 

Cependant il semble que le serveur Python n'envoie un FeOF à la fin de la sortie pour que la page php expire et n'affiche rien. Comme je l'ai dit plus haut, juste exécuter echo fgets ($ handle), le travail bien, et la sortie d'une ligne, exécutant la commande sous ni affichera la ligne suivante etc

J'ai joint la partie importante de mon script Python Script:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind(("", port)) 
s.listen(5) 
print "OK." 
print " Listening on port:", port 
import subprocess 
while 1: 
    con, addr = s.accept() 
    while True: 
     datagram = con.recv(1024) 
     if not datagram: 
      break 
     print "Rx Cmd:", datagram 
     print "Launch:", datagram 
     process = subprocess.Popen(datagram+" &", shell=True, stdout=subprocess.PIPE) 
     stdout, stderr = process.communicate() 
     con.send(stdout) 
    con.close() 
s.close() 

Je joins également le script complet de PHP:

<?php 
$handle = fsockopen("tcp://xxx.xxx.xxx.xxx",12345); 
fwrite($handle,"ls"); 
echo fgets($handle); 
fclose($handle); 
?> 

Merci, Ashley

Répondre

1

Je crois que vous avez besoin pour corriger un peu le code de votre serveur. J'ai enlevé la boucle interne. Le problème avec votre code était que le serveur n'a jamais fermé la connexion, donc feof n'a jamais retourné vrai. J'ai également supprimé le bit + " &". Pour obtenir la sortie, vous devez attendre que le processus se termine de toute façon. Et je ne suis pas sûr de savoir comment le shell va gérer le & dans ce cas.

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind(("", port)) 
s.listen(5) 
print "OK." 
print " Listening on port:", port 
import subprocess 
try: 
    while 1: 
     con, addr = s.accept() 
     try: 
      datagram = con.recv(1024) 
      if not datagram: 
       continue 
      print "Rx Cmd:", datagram 
      print "Launch:", datagram 
      process = subprocess.Popen(datagram, shell=True, stdout=subprocess.PIPE) 
      stdout, stderr = process.communicate() 
      con.send(stdout) 
     finally: 
      print "closing connection" 
      con.close() 
except KeyboardInterrupt: 
    pass 
finally: 
    print "closing socket" 
    s.close() 

BTW, vous devez utiliser la boucle while dans votre script php. fgets renvoie jusqu'à une seule ligne.

+0

Le travail est parfaitement merci, une dernière chose, actuellement quand je Cntrl + C hors du programme pour le fermer, il ne ferme pas proprement la section. J'ai regardé l'exécution d'une instruction while pour cntr + quelque chose qui fermait alors le socket. Mais je ne savais pas si je pouvais le faire tout en exécutant la déclaration du logiciel. – AshleyUK

+0

Je suppose que vous voulez dire le programme du serveur, pas le client PHP? Dans ce cas, je crois que s.close() dans la dernière clause finally devrait fermer le socket quand Ctrl-C est également utilisé. Lorsque vous quittez le serveur avec Ctrl-C, vous devriez voir "closing socket" imprimé sur la console. Ne voyez-vous pas cela? – codeape

+0

Lorsque j'utilise Cntrl + C je reçois: Traceback (le plus récent appel dernier): Fichier "vzctl.py", ligne 15, en con, adr = s.accept() fichier «/usr/local/lib /python2.5/socket.py ", ligne 167, dans accepter sock, addr = self._sock.accept() KeyboardInterrupt Il libère le socket maintenant, je ne l'avais pas testé correctement depuis votre changement de code , cependant je ne suis pas sûr si les erreurs qui sont montrées après la fermeture du socket sont correctes? – AshleyUK

Questions connexes