我有一个Python服务器最终工作并使用输出响应多个命令,但是我现在遇到PHP接收完整输出的问题。我已经尝试过诸如fgets,fread之类的命令,唯一可行的命令就是“fgets”。
然而,这只接收了数据,然后我创建了一个while语句,如下所示:
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
echo $buffer;
}
然而,似乎Python服务器没有在输出结束时发送Feof,因此php页面超时并且不显示任何内容。就像我上面所说的那样,只运行echo fgets($ handle),工作正常,输出的一行,再次运行命令都不会显示下一行e.t.c
我附上了我的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);
?>
谢谢, 阿什利
答案 0 :(得分:1)
我相信您需要稍微修改一下您的服务器代码。我删除了内部while循环。您的代码的问题是服务器从未关闭连接,因此feof
永远不会返回true。
我还删除了+ " &"
位。要获得输出,您需要等到过程结束。在这种情况下,我不确定shell如何处理&
。
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
只返回一行。