我有一個動態生成的PHP文件,其中包括(通過包括)在其他PHP腳本。當第一個(出於某些不明原因)由parse-errors生成時,會導致主腳本解析錯誤停止執行。PHP包含文件解析錯誤
有沒有什麼辦法在包含文件時檢測到分析錯誤,這樣我可以動態地重新生成該文件?
我有一個動態生成的PHP文件,其中包括(通過包括)在其他PHP腳本。當第一個(出於某些不明原因)由parse-errors生成時,會導致主腳本解析錯誤停止執行。PHP包含文件解析錯誤
有沒有什麼辦法在包含文件時檢測到分析錯誤,這樣我可以動態地重新生成該文件?
5.0.4之後棄用 – 2009-08-10 14:34:00
只是注意到......改變了我的答案。 – 2009-08-10 14:34:55
我會想象一個像php_check_syntax()這樣的函數調用會比產生一個新進程快得多..現在太糟了,它現在消失了:( – rustyx 2013-02-04 16:18:59
您可以執行(使用exec()或類似)php -l file.php
,看看結果。我覺得在每一個包含內容都會這樣做會很慢。
修復導致您生成有時無效的PHP文件的任何問題會不會更好?
你可以做一個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.
}
不會file_get_contents()只是給你php代碼如果$ path是一個文件名? – 2009-08-10 14:35:18
我有一個腳本會通過我的代碼樹並查找語法錯誤。它不是很先進,但它的基本功能是
$cmd="php -l " . $basedir . $dir . "/" . $file;
$s=exec($cmd,$k);
if(strstr($s,"No syntax errors detected")) { include($basedir.$dir."/".$file); }
這將運行PHP -l上的腳本,你將要包括的,如果沒有errrors加載它。
通過執行shell_exec(),您可以看到輸出,就像您通過命令行執行該文件一樣。你可以看到這裏是否有錯誤。
<?php
if (strpos(shell_exec('php -l file.php'), 'Syntax Error')) {
die('An error!');
}
SYNTAX.php filename.php
WHERE SYNTAX.php是:
<?php
error_reporting(E_ALL);
ini_set('display_errors','On');
include($_SERVER['QUERY_STRING']);
?>
如果你能保證你總是產生正確解析的代碼(這應該很容易實現與正確轉義等),那麼唯一可能出錯的方式是寫入文件的過程中斷(例如停電,內存不足,進程死亡等)。在這種情況下,你最終會得到一個部分文件。
您可以通過在文件末尾添加簽名並在調用include()之前檢查它的存在來防止這些部分寫入。
例如,如果你在最後寫<?php $complete=1; ?>
,你可以檢查它的存在後:
$contents = file_get_contents($path);
if (strpos($contents, '<?php $complete=1; ?>')) {
include($path);
}
聽起來像是你需要解決那些導致包含腳本語法分析錯誤的問題。我不知道如何檢測它們,但是如果一次出現錯誤,那麼如果使用相同的方法重新生成它似乎會再次出錯。 – 2009-08-10 14:31:46
還有其他的情況下,你可以得到一個不正確的文件,像停電或服務器故障的情況 – jab 2009-08-11 04:46:15