c-如何在PHP中从命令行捕获stderr


c - How to capture stderr from command line in PHP

我想创建一个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",如果没有错误,则执行上面给出的第二步。

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的详细控制。

PHP包含大量用于执行外部进程的函数,每个函数都有自己的一组定义。

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