Цикл Fget с fsockopen в PHP 5.x - PullRequest
3 голосов
/ 21 июня 2009

У меня наконец-то работает сервер Python, и я отвечаю на несколько команд с помощью выходных данных, однако сейчас у меня проблемы с получением полного вывода PHP. Я пробовал команды, такие как fgets, fread, единственная команда, которая, кажется, работает, это "fgets".

Однако, это только получение данных в строке, затем я создал оператор while, показанный ниже:

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

Однако кажется, что сервер Python не отправляет Feof в конце вывода, поэтому страница php отключается и ничего не отображает. Как я уже говорил выше, просто запустив 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);
?>

Спасибо, Ashley

1 Ответ

1 голос
/ 21 июня 2009

Полагаю, вам нужно немного исправить код своего сервера. Я удалил внутренний цикл. Проблема с вашим кодом заключалась в том, что сервер никогда не закрывал соединение, поэтому 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()

Кстати, вам нужно использовать цикл while в вашем php-скрипте. fgets возвращает до одной строки.

...