2010-08-11 175 views
4

我有一個gcc.exe文件命名,我有一個PHP網頁... 我想用:嘗試編譯C代碼PHP

gcc test.c 

而且,如果有一些編譯錯誤,我想在php頁面上顯示它... 但我不能。 會發生什麼情況是:如果文件是正確的,它會生成.exe文件, ,但如果它是錯誤的,則不會發生任何事情。我想在這裏再次顯示所有錯誤。

任何人有想法?

編輯[1]: 某些代碼:

<?php 
exec("gcc teste.c",$results); 
print_r($results) 
?> 

輸出:

*Nothing* 

編輯[2]: 我tryed把GCC輸出上的文本文件: 這樣(提示):

gcc test.c > teste.txt

在屏幕上,屏幕上的所有東西都轉到文本文件。 但這是不夠的!



編輯[3]: quantumSoup: 我tryed它,並...

array(0) { } int(1)

沒什麼......更多嗎?

+0

請顯示一些代碼。 – 2010-08-11 15:36:27

+0

具有'.bat'文件的解決方案是可行的嗎? – Richard 2010-08-11 15:56:05

+0

當我正在嘗試執行的程序/命令沒有exec權限時(幾乎總是從Apache在UNIX系統中是'nobody'),它發生在我身上。我不認爲沒有改變服務器配置的解決方法,你可能無法訪問 – 2010-08-11 20:56:49

回答

6

GCC很可能在stderr產生錯誤輸出,它似乎exec不會在$結果數組中獲取。對此的解決方案很可能是針對特定平臺的。如果你在類似unix的環境中工作,可以像gcc foo.c 2>&1那樣將stderr重定向到stdout。我不知道如何在Windows上實現這一點,或者即使存在類似的概念。也許別人可以詳細說明你的問題是否是平臺特定的。

這是支持的事實,即管道到文件也沒有工作。

+0

嗡嗡聲,我在Windows上運行(sht ... rs)。但暫時......我想穩定它在Windows和Unix上運行! – Richard 2010-08-11 15:52:48

+0

嘗試proc_open()並設置第三個descriptipecpec/pipe以獲取stderr輸出。 – mario 2010-08-11 16:51:32

+0

正是在Linux上! – Richard 2010-08-12 17:01:25

3

exec() reference

string exec (string $command [, array &$output [, int &$return_var ]]) 

嘗試

exec('gcc test.c', $output, $return); 

var_dump($output); 
var_dump($return); 
+0

也可能想要捕獲返回變量。如果gcc不輸出任何內容,捕獲成功退出代碼將會很有用。 – 2010-08-11 15:40:47

+0

我嘗試過,但根本不顯示任何東西! – Richard 2010-08-11 15:41:09

+0

@Richard:嘗試我編輯的答案併發布結果 – quantumSoup 2010-08-11 15:43:12

0

使用proc_open捕捉標準錯誤:

<?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 
0

我們使用一個基於PHP的系統進行構建和windows下拍攝的結果和錯誤。通過讓PHP腳本創建一個包含所有構建命令的批處理文件,然後再創建該批處理文件,我們取得了最大的成功。當它創建批處理文件時,它會將編譯器的標準輸出重定向到一個日誌文件,並將標準錯誤重定向到另一個日誌文件(commandname >>log.txt 2>>err.txt)。由於你的輸出是在兩個文件之間進行分割的,所以它也有助於讓腳本生成迴應出現的情況的描述(例如「構建庫libsockets.dll」),以便更好地匹配這兩個日誌。有時,甚至可以在執行每個命令之前將其回顯出來。通常,當遇到錯誤時,構建過程會停止(至少可能是應爲),因此錯誤日誌的內容通常與正常日誌的尾部匹配。