2009-06-21 9 views
3

我有一个Python服务器终于工作并响应多个命令的输出,但是我现在遇到了PHP接收完整输出的问题。我已经尝试过诸如fgets,fread之类的命令,似乎可行的唯一命令是“fgets”。在PHP 5.x中使用fsockopen循环Fget

然而,这仅收到对数据线的,然后,我创建了一个while语句以下所示的:

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

但是它似乎是Python的服务器没有在输出使PHP页面结束发送FEOF超时并且不显示任何内容。就像我上面所说的那样,只是运行echo fgets($ handle),工作正常,输出的一行,再次运行命令都不会显示下一行等。

我附上了Python脚本的重要部分:

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() 

我还附上完整的PHP脚本:

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

感谢, 阿什利

回答

1

我相信你需要修复你的服务器代码。我已经删除了内部while循环。您的代码存在的问题是服务器从未关闭连接,因此feof从未返回true。

我也删除了+ " &"位。要获得输出,您需要等到流程结束。我不确定壳在这种情况下如何处理&

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() 

顺便说一句,你需要在你的php脚本中使用while循环。 fgets只返回一行。

+0

工作非常感谢,最后一件事,当我Cntrl + C退出程序关闭它时,它并不干净地关闭该部分。我查看了运行一段时间语句的cntr +然后关闭套接字。但是我不知道我是否仍然可以在运行软件的while语句的同时做到这一点。 – AshleyUK 2009-06-21 18:31:35