سؤال

ولدي بيثون خادم العمل أخيرا والاستجابة إلى الأمر متعددة مع الإخراج، ولكن أواجه الآن مشكلة مع PHP تلقي الانتاج الكامل. لقد حاولت أوامر مثل fgets، fread، الأمر الوحيد الذي يبدو للعمل هو "fgets".

ولكن هذا فقط تلقي على الخط من البيانات، وبعد ذلك خلق بيانا في حين أظهرت رفع الصوت عاليا:

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

ولكن يبدو أن الخادم بيثون لا تبعث Feof في نهاية الانتاج بحيث الأوقات الصفحة فب بها ولا يعرض أي شيء. كما قلت أعلاه، وانما تشغيل fgets صدى (مقبض $)، ودفع غرامة، والإخراج في خط عمل واحد، تشغيل الأمر مرة أخرى تحت لا سيعرض e.t.c السطر التالي

ولقد تعلق جزء مهم من بلدي رفع الصوت عاليا بيثون البرنامج:

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);
?>

وشكرا، اشلي

هل كانت مفيدة؟

المحلول

وأعتقد أنك بحاجة إلى إصلاح رمز من خادم قليلا. لقد أزالت حلقة في حين الداخلية. كانت المشكلة مع التعليمات البرمجية الخاصة بك أن الملقم أبدا إغلاق الاتصال، لذلك 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()

وراجع للشغل، تحتاج إلى استخدام في حين حلقة في البرنامج النصي الخاص بي. عودة fgets حتى سطر واحد فقط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top