2009-06-21 6 views
3

私は最終的に動作するPythonサーバーを持っていて、複数のコマンドの出力に応答していますが、現在PHPが完全な出力を受け取っているという問題があります。私はfgets、freadなどのコマンドを試していますが、動作するように見える唯一のコマンドは "fgets"です。 PythonのサーバがPHPのページので、出力の最後にFEOFを送信していないようですがPHP 5.xでfsockopenを使ってループするFgetock

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

データのライン上しかし、この唯一のレシーブさんは、私はその後、怒鳴る示すwhile文を作成しましたタイムアウトして何も表示しません。上で述べたように、echo fgets($ handle)を実行してもうまく動作し、出力は1行で、次の行は表示されません。

Pythonスクリプトの重要な部分を添付しました。私はまた、完全なPHPスクリプトを添付している

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 
$handle = fsockopen("tcp://xxx.xxx.xxx.xxx",12345); 
fwrite($handle,"ls"); 
echo fgets($handle); 
fclose($handle); 
?> 

おかげで、 アシュリー

答えて

1

私はあなたが必要と考えているがあなたのサーバーコードを少し修正してください。私は内部whileループを削除しました。あなたのコードの問題は、サーバーが決して接続を閉じなかったということでした。だからfeofは真を返しませんでした。

また、+ " &"ビットを削除しました。出力を取得するには、処理が終了するまで待つ必要があります。この場合、シェルがどのように&を処理するかはわかりません。

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は、1行だけに戻ります。

+0

作業の完全なありがとう、最後の1つは、現在私はそれを閉じるためにプログラムからCntrl + Cを、それはきれいにセクションを閉じることはありません。私はcntr +のためのwhileステートメントを実行して、ソケットを閉じることを検討しました。しかし、私はソフトウェアのwhileステートメントを実行している間にそれを実行できるかどうかは分かりませんでした。 – AshleyUK

+0

PHPクライアントではなくサーバープログラムを意味すると思いますか?その場合、最後のfinally節の中のs.close()は、Ctrl-Cが使用されているときにソケットを閉じるべきだと私は信じています。 Ctrl-Cでサーバを終了すると、コンソールに "closing socket"と表示されるはずです。あなたはそれを見ませんか? – codeape

+0

Cntrl + Cを使用すると、トレースバック(直前の最後の呼び出し): ファイル「vzctl.py」15行目 con、addr = s.accept() ファイル "/ usr/local/lib /python2.5/socket.py "、line 167、accept in sock、addr = self._sock.accept() KeyboardInterrupt これはソケットを解放します。コード変更後に正しくテストされませんでしたしかし、ソケットを閉じた後にエラーが表示されているのかどうかはわかりません。 – AshleyUK

関連する問題