PHP 5.x fsockopen ile fget loop

1 Cevap php

Ben bir Python Sunucu nihayet ancak şimdi sorunun en PHP tam çıkış alma ile yaşıyorum, çalışma ve çoklu komut adlı çıkış ait ile yanıt var. Ben fgets, fread, "fgets" dir çalışmak gibi tek komut olarak komutları denedim.

Ancak bu sadece tarifesi verilerinin hattı üzerinde, o zaman feryat gösterilen while deyimini yarattı:

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

Ancak Python sunucu böylece php sayfa kez dışarı çıktı sonunda feof göndermiyor ve bir şey göstermek değil gibi görünüyor. Sanki sadece yankı fgets ($ handle), eserin ince ve çıkışın bir satır çalıştıran altında yeniden komutu çalıştırarak ne vb sonraki satırını görüntüler, yukarıda söylediğim

Ben Python Senaryo körüğün önemli bölümünü eklenmiş:

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

Ben de tam PHP komut eklenmiş:

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

Thanks, Ashley

1 Cevap

Ben size sunucu kodu biraz düzeltmek gerekir inanıyorum. Ben iç while döngüsü kaldırdık. Kodunuzu sorun sunucu bağlantıyı asla kapalı olduğunu, bu yüzden feof true asla döndü.

Ayrıca + " &" bit kaldırıldı. Çıktı almak için, süreci yine sona kadar beklemek gerekir. Ve ben kabuk bu durumda & nasıl ele emin değilim.

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

BTW, sizin php komut ise-döngü kullanmak gerekir. fgets sadece tek bir satır kadar döndürür.