我有一个名为gcc.exe的文件,我有一个php页面... 我想用:
gcc test.c
并且,如果有一些编译错误,我想在php页面上显示它... 但我不能。 会发生什么:如果文件正确,它会生成.exe文件, 但如果错了,什么都没发生。我想要的是再次显示所有错误。
有人有想法吗?
修改[1]: 一些代码:
<?php
exec("gcc teste.c",$results);
print_r($results)
?>
输出:
*Nothing*
修改[2]: 我尝试将gcc输出放在文本文件中: 这样(在提示符下):
gcc test.c > teste.txt
在屏幕上,屏幕上的所有内容都会转到文本文件。 但这是不合适的!
编辑[3]: quantumSoup:
我试过了,然后......
array(0) { } int(1)
没什么......还有什么?
答案 0 :(得分:6)
gcc可能会在stderr
上生成错误输出,它会显示exec
未在$ results数组中捕获。对此的解决方案可能有点特定于平台。如果您在类似unix的环境中工作,则可以执行gcc foo.c 2>&1
之类的操作将stderr重定向到stdout。我不知道如何在Windows上实现这一目标,或者甚至存在类似的概念。如果您的问题是特定于平台的,也许其他人可以详细说明。
这得到了以下事实的支持:文件的管道也不起作用。
答案 1 :(得分:3)
string exec ( string $command [, array &$output [, int &$return_var ]] )
尝试
exec('gcc test.c', $output, $return);
var_dump($output);
var_dump($return);
答案 2 :(得分:0)
使用proc_open
捕获stderr:
<?php
$process = proc_open('gcc test.c',
array(
1 => array("pipe", "w"), //stdout
2 => array("pipe", "w") // stderr
), $pipes);
echo stream_get_contents($pipes[2]);
给出了例如:
sh: gcc: command not found
答案 3 :(得分:0)
我们使用基于PHP的系统来执行构建并在Windows下捕获结果和错误。通过让PHP脚本创建包含所有构建命令的批处理文件,然后exec
- 批处理文件,我们取得了最大的成功。在创建批处理文件时,它会将编译器的标准输出重定向到一个日志文件,将标准错误重定向到另一个(commandname >>log.txt 2>>err.txt
)。由于您的输出是在两个文件之间拆分的,因此脚本生成的行会回显有关正在发生的事情的描述(例如“构建库libsockets.dll”),这样您就可以更好地匹配这两个日志。有时,它甚至可以帮助在执行之前回显每个命令。通常,您的构建过程将在遇到错误时停止(至少它可能应),因此错误日志的内容通常与正常日志的尾端匹配。