2009-08-10 115 views
1

我有一個動態生成的PHP文件,其中包括(通過包括)在其他PHP腳本。當第一個(出於某些不明原因)由parse-errors生成時,會導致主腳本解析錯誤停止執行。PHP包含文件解析錯誤

有沒有什麼辦法在包含文件時檢測到分析錯誤,這樣我可以動態地重新生成該文件?

+3

聽起來像是你需要解決那些導致包含腳本語法分析錯誤的問題。我不知道如何檢測它們,但是如果一次出現錯誤,那麼如果使用相同的方法重新生成它似乎會再次出錯。 – 2009-08-10 14:31:46

+0

還有其他的情況下,你可以得到一個不正確的文件,像停電或服務器故障的情況 – jab 2009-08-11 04:46:15

回答

3

您可以運行PHP的命令行版本來檢查語法:

php -l filename 

如果您需要從PHP腳本檢查語法,使用exec()函數調用命令行程序。

又見棄用功能php_check_syntax()

+1

5.0.4之後棄用 – 2009-08-10 14:34:00

+0

只是注意到......改變了我的答案。 – 2009-08-10 14:34:55

+1

我會想象一個像php_check_syntax()這樣的函數調用會比產生一個新進程快得多..現在太糟了,它現在消失了:( – rustyx 2013-02-04 16:18:59

0

您可以執行(使用exec()或類似)php -l file.php,看看結果。我覺得在每一個包含內容都會這樣做會很慢。

修復導致您生成有時無效的PHP文件的任何問題會不會更好?

-2

你可以做一個file_get_contents,然後掃描它看看是否有任何解析錯誤。

$contents = file_get_contents($path); 
if (stripos($contents, 'Parse error:') !== 0) 
{ 
    // There was a parse error. 
} else { 
    // There were no parse errors. 
} 
+2

不會file_get_contents()只是給你php代碼如果$ path是一個文件名? – 2009-08-10 14:35:18

0

我有一個腳本會通過我的代碼樹並查找語法錯誤。它不是很先進,但它的基本功能是

$cmd="php -l " . $basedir . $dir . "/" . $file; 
$s=exec($cmd,$k); 
if(strstr($s,"No syntax errors detected")) { include($basedir.$dir."/".$file); } 

這將運行PHP -l上的腳本,你將要包括的,如果沒有errrors加載它。

0

通過執行shell_exec(),您可以看到輸出,就像您通過命令行執行該文件一樣。你可以看到這裏是否有錯誤。

<?php 
if (strpos(shell_exec('php -l file.php'), 'Syntax Error')) { 
    die('An error!'); 
} 
1

SYNTAX.php filename.php

WHERE SYNTAX.php是:

<?php 
error_reporting(E_ALL); 
ini_set('display_errors','On'); 

include($_SERVER['QUERY_STRING']); 
?> 
0

如果你能保證你總是產生正確解析的代碼(這應該很容易實現與正確轉義等),那麼唯一可能出錯的方式是寫入文件的過程中斷(例如停電,內存不足,進程死亡等)。在這種情況下,你最終會得到一個部分文件。

您可以通過在文件末尾添加簽名並在調用include()之前檢查它的存在來防止這些部分寫入。

例如,如果你在最後寫<?php $complete=1; ?>,你可以檢查它的存在後:

$contents = file_get_contents($path); 
if (strpos($contents, '<?php $complete=1; ?>')) { 
    include($path); 
}