11

文件 a.php:

<?php
echo "abcdef";
?>

文件 b.php:

<?php
$h=popen('php a.php',r);
pclose($h);
?>

问题:

我在控制台上看不到回显结果;为什么以及如何看到它?

我不想在文件 b.php 中这样做:echo stream_get_contents($h);

4

3 回答 3

11

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.

于 2013-04-13T13:38:43.980 回答
5

您无法在控制台上看到回显结果,因为它从未进入控制台。通过以读取模式打开进程,它的 STDOUT 链接到打开进程的文件句柄。输出到控制台的唯一方法是从该文件句柄中读取,然后回显它。

换句话说,流程就是这样。

  • b.php 开始运行 - 它的 STDIN 和 STDOPUT 像往常一样链接到您的控制台
  • 它以读取模式调用 popen 并将流资源存储在 $h
  • 这会导致 a.php 开始运行,它的 STDOUT 链接到 $h 中的文件描述符,而它的 STDIN 没有链接到任何东西
  • 如您所见,这意味着 a.php 无法直接访问启动 b.php 的控制台
  • a.php 将其输出写入该流,然后完成运行
  • b.php 从来没有对 $h 中的流做任何事情,它只是关闭它,所以 a.php 的输出丢失了。

希望能解释这里发生了什么。如果你想在控制台看到 a.php 的输出,那么 b.php 需要从 $h 中的流中读取它,然后回显它,因为只有 b.php 可以访问控制台。

或者,如果您使用 system() 而不是 popen(),输出将自动输出到调用脚本的控制台上,因为使用 system() 会将主脚本的 STDIN 和 STOUT 移交给您调用的程序或脚本。

于 2014-08-22T01:30:18.783 回答
0

尝试这个:

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();
}
于 2019-09-17T19:47:13.590 回答