文件 a.php:
<?php
echo "abcdef";
?>
文件 b.php:
<?php
$h=popen('php a.php',r);
pclose($h);
?>
问题:
我在控制台上看不到回显结果;为什么以及如何看到它?
我不想在文件 b.php 中这样做:echo stream_get_contents($h);
Check the second example in the documentation on popen, it shows exactly how to do that:
<?php
error_reporting(E_ALL);
/* Add redirection so we can get stderr. */
$handle = popen('/path/to/executable 2>&1', 'r');
echo "'$handle'; " . gettype($handle) . "\n";
$read = fread($handle, 2096);
echo $read;
pclose($handle);
This snippet reads from stderr. Remove the pipe to read from stdout.
您无法在控制台上看到回显结果,因为它从未进入控制台。通过以读取模式打开进程,它的 STDOUT 链接到打开进程的文件句柄。输出到控制台的唯一方法是从该文件句柄中读取,然后回显它。
换句话说,流程就是这样。
希望能解释这里发生了什么。如果你想在控制台看到 a.php 的输出,那么 b.php 需要从 $h 中的流中读取它,然后回显它,因为只有 b.php 可以访问控制台。
或者,如果您使用 system() 而不是 popen(),输出将自动输出到调用脚本的控制台上,因为使用 system() 会将主脚本的 STDIN 和 STOUT 移交给您调用的程序或脚本。
尝试这个:
while (@ ob_end_flush()); // end all output buffers if any
$proc = popen('/path/to/executable 2>&1', 'r');
while (!feof($proc))
{
echo fread($proc, 4096);
@ flush();
}