【问题标题】:How to capture stderr from command line in PHP如何在 PHP 中从命令行捕获 stderr
【发布时间】:2012-08-27 22:17:37
【问题描述】:

我想创建一个 C/C++ 的在线编译器。

到目前为止,我已经开发了以下代码:

<?php
error_reporting(E_ALL);
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{


    move_uploaded_file($_FILES["file"]["tmp_name"],$_FILES["file"]["name"]);
    compile();
}
function compile()
{
$a=shell_exec('gcc -o Compile Compile.c');
echo $a;
$b=shell_exec('./Compile');
echo $b;
}
?>

文件 Compile.c 正在上传,然后由 gcc 编译。 我想做的是:

  • 编译出错时从stderr读取错误并显示在网页上。
  • 如果没有错误,则在输入文件上执行代码并显示执行时间,如果时间超过特定值,则显示超出时间限制错误。

我在网上搜索,发现如果编译语句后附加“2>&1”为

$a=shell_exec('gcc -o Compile Compile.c 2>&1');

然后将编译错误的输出返回给分配的变量(在上面的情况下为$a),但不是没有它。所以我的问题是如何检查错误然后将其显示在网页上而不附加“2>&1”,如果没有错误,则执行上面给出的第二步。

【问题讨论】:

  • 如果它适用于2&gt;&amp;1,你为什么不直接使用它呢?
  • 如果我使用2>&1,我将无法知道它是否是错误的。
  • 当您需要更好地控制进程时使用 proc_open:stackoverflow.com/questions/2320608/php-stderr-after-exec
  • proc_open() 是否执行 shell 命令?我尝试使用 proc_open() 编译 c,但它没有正确响应。也许我使用了一些错误的论点。

标签: php c compiler-construction


【解决方案1】:

proc_open() 的正确用法如下所示:

$process = proc_open('gcc -o Compile Compile.c', array(
    0 => array('pipe', 'r'), // STDIN
    1 => array('pipe', 'w'), // STDOUT
    2 => array('pipe', 'w')  // STDERR
), $pipes);

if(is_resource($process)) {
    // If you want to write to STDIN
    fwrite($pipes[0], '...');
    fclose($pipes[0]);

    $stdOut = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    $stdErr = stream_get_contents($pipes[2]);
    fclose($pipes[2]);

    $returnCode = proc_close($process);
}

这将执行 shell 命令并为您提供对 STDIN、STDOUT 和 STDERR 的详细控制。

【讨论】:

    【解决方案2】:

    PHP 包含大量用于执行外部进程的函数,每个函数都有自己的一系列缺陷。

    在这种特殊情况下,您可以通过使用exec(并使用2&gt;&amp;1 将stderr 重定向到stdout)来保持一些简单性。返回值,虽然是字符串,但是没用;它只是输出的最后一行;但是,第二个参数应该是一个包含输出的数组(每行一个条目),第三个参数 return_var 将告诉您编译是否成功:0 表示成功,其他任何一个失败。

    【讨论】:

      猜你喜欢
      • 2012-08-22
      • 2013-02-10
      • 2018-05-04
      • 2023-04-05
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2021-05-29
      相关资源
      最近更新 更多