我想创建一个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编译。 我想做的是:
我搜索了互联网并发现如果编译语句被“2&gt;&amp; 1”附加为
$a=shell_exec('gcc -o Compile Compile.c 2>&1');
然后编译错误的输出返回到赋值变量(在上面的情况下是$ a),但不是没有它。所以我的问题是如何检查错误然后在网页上显示它而不附加“2&gt;&amp; 1”,如果没有错误,则执行上面给出的第二步。
答案 0 :(得分:2)
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的详细控制。
答案 1 :(得分:0)
PHP包含许多用于执行外部进程的函数,每个函数都有自己的一组缺陷。
在这种特殊情况下,您可以通过使用exec
(并将stderr重定向到带有2>&1
的stdout)来保持一些简单性。返回值虽然是一个字符串,但是没用;它只是输出的最后一行;但是,第二个参数应该是一个填充输出的数组(每行一个条目),第三个参数return_var
将告诉您编译是否成功:0
表示成功,其他任何事情都失败了。