私は最終的に動作する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つは、現在私はそれを閉じるためにプログラムからCntrl + Cを、それはきれいにセクションを閉じることはありません。私はcntr +のためのwhileステートメントを実行して、ソケットを閉じることを検討しました。しかし、私はソフトウェアのwhileステートメントを実行している間にそれを実行できるかどうかは分かりませんでした。 – AshleyUK
PHPクライアントではなくサーバープログラムを意味すると思いますか?その場合、最後のfinally節の中のs.close()は、Ctrl-Cが使用されているときにソケットを閉じるべきだと私は信じています。 Ctrl-Cでサーバを終了すると、コンソールに "closing socket"と表示されるはずです。あなたはそれを見ませんか? – codeape
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