कमांड लाइन आउटपुट पढ़ें - PHP, एचटीएमएल, लिनक्स

कोई भी मदद कर सकता है, php का उपयोग कर linux में कमांड टर्मिनल आउटपुट से वास्तविक समय आउटपुट कैसे पढ़ा जाए।

नीचे कोड मैंने कोशिश की लेकिन काम नहीं कर रहा है:

<?php
if (isset($_POST["pyinp"])){
$cmd = "ping 127.0.0.1";
$descriptorspec = array(
0 => array("pipe", "r"),   // stdin is a pipe that the child will read from
1 => array("pipe", "w"),   // stdout is a pipe that the child will write to
2 => array("pipe", "w")    // stderr is a pipe that the child will write to
);
flush();
$process = proc_open($cmd, $descriptorspec, $pipes, realpath("./"), array());
echo "<pre>";
if (is_resource($process)) {
while ($s = fgets($pipes[1])) {
print $s;
flush();
}
}
echo "</pre>";
}
?>
<!DOCTYPE html>
<html>
<body>
<form action="#" method="POST">
<input name = "pyinp" type="submit">
</form>
</body>
</html>

मुझे सबमिट बटन मिल रहा है और जब मैं सबमिट करता हूं तो कुछ भी नहीं आ रहा है।

मैं एचटीएमएल और PHP के लिए नया हूँ। मैं सिर्फ ऑनलाइन कोड।

नीचे कोड काम कर रहा है:

<!DOCTYPE html>
<html>
<body>
<form action="#" method="POST">
<input name = "pyinp" type="submit">
</form>
<?php
if (isset($_POST["pyinp"])){
$cmd = "ping 127.0.0.1";
$descriptorspec = array(
0 => array("pipe", "r"),   // stdin is a pipe that the child will read from
1 => array("pipe", "w"),   // stdout is a pipe that the child will write to
2 => array("pipe", "w")    // stderr is a pipe that the child will write to
);
echo "<pre>";
if( ($fp = popen("ls -l", "r")) ) {
while( !feof($fp) ){
echo fread($fp, 1024);
flush(); // you have to flush buffer
}
fclose($fp);
}
}
?>
</body>
</html>

लेकिन अगर मैं पिंग 127.0.0.1 के साथ प्रतिस्थापित करता हूं तो यह काम नहीं करता है

धन्यवाद

उत्तर:

जवाब के लिए 0 № 1

टीएल; डीआर: एचटीएमएल दस्तावेज़ बंद होने से पहले आपके पास अनंत लूप है।


मुझे अपना कोड दोबारा लिखने दें, ताकि पिंग आउटपुट में जाना चाहिए <body>...</body> कंटेनर:

<!DOCTYPE html>
<html>
<body>
<form action="#" method="POST">
<input name = "pyinp" type="submit">
</form>
<?php
if (isset($_POST["pyinp"])){
$cmd = "ping 127.0.0.1";
$descriptorspec = array(
0 => array("pipe", "r"),   // stdin is a pipe that the child will read from
1 => array("pipe", "w"),   // stdout is a pipe that the child will write to
2 => array("pipe", "w")    // stderr is a pipe that the child will write to
);
flush();
$process = proc_open($cmd, $descriptorspec, $pipes, realpath("./"), array());
echo "<pre>";
if (is_resource($process)) {
while ($s = fgets($pipes[1])) {
print $s;
flush();
}
}
echo "</pre>";
}
?>

</body>
</html>

अब, चलो एक विचार प्रयोग करते हैं। पहली बार आप GET पृष्ठ, आप एक बटन के साथ एक फार्म देखते हैं। सब ठीक हैं। आप बटन पर क्लिक करें। फॉर्म हो जाता है POSTखुद को वापस संपादित करें। तो क्या होता है?

सबसे पहले, स्थिर एचटीएमएल आउटपुट है:

<!DOCTYPE html>
<html>
<body>
<form action="#" method="POST">
<input name = "pyinp" type="submit">
</form>

तो PHP इंजन सक्रिय करता है:

<?php

फिर PHP देखता है कि बटन दबाया गया था, और पाइप सेट करने के लिए सामान का एक गुच्छा करता है (यह सब सही है, बीटीडब्ल्यू, आप कमांड लाइन पर जांच सकते हैं):

$cmd = "ping 127.0.0.1";
$descriptorspec = array(
0 => array("pipe", "r"),   // stdin is a pipe that the child will read from
1 => array("pipe", "w"),   // stdout is a pipe that the child will write to
2 => array("pipe", "w")    // stderr is a pipe that the child will write to
);
flush();
$process = proc_open($cmd, $descriptorspec, $pipes, realpath("./"), array());
echo "<pre>";

फिर यह जांचता है कि कनेक्शन बनाया गया है (आपको वास्तव में एक जोड़ना चाहिए else यहाँ):

if (is_resource($process)) {

अब क्या?

while ($s = fgets($pipes[1])) {
print $s;
flush();
}

यह सही है: थोड़ी देर लूप जो कभी खत्म नहीं होता! यह स्पिन और स्पिन हमेशा के लिए होता है। इस बीच, इनमें से कोई भी निष्पादित नहीं होता है:

?>

</body>
</html>

तो ब्राउज़र शरीर को कभी न देखता है। तो क्या, तुम पूछो? खैर, जब तक कि यह सभी टैग बंद नहीं हो जाता तब तक ब्राउज़र को सामग्री प्रदर्शित करने का कोई दायित्व नहीं है।

"लेकिन, लेकिन, यह कभी-कभी काम करता है!" आप चीखें। निश्चित रूप से, कभी-कभी यह काम करता है। लेकिन इस बार ऐसा लगता है कि लोडिंग बस है ठप, सिर्फ बुरा HTML नहीं। ब्राउजर यह नहीं जानता कि आपको एक अनंत लूप मिला है जो कभी खत्म नहीं होगा, इसलिए यह आपके आउटपुट को बंद करने के लिए बस इंतजार कर रहा है।

सामान्य रूप में:

वेब लेखकों से सावधान रहें - जब तक कि आप वेबकिट त्रुटि सहनशीलता कोड में एक उदाहरण के रूप में प्रकट नहीं करना चाहते हैं - अच्छी तरह से बनाए गए HTML लिखें।

यदि आप यह काम देखना चाहते हैं, तो एक अनंत लूप न करें:

$i = 0;
while ($s = fgets($pipes[1])) {
print $s;
flush();
if (4 < $i++) { break; }
}

या जावास्क्रिप्ट लोड है, जो काम करता है कि एक स्क्रिप्ट पर वापस बुलाओ।


संबंधित सवाल
सबसे लोकप्रिय