2009-08-10 2 views
1

У меня есть динамически сгенерированный PHP-файл, который включен (через include) в другой скрипт PHP. Когда первый (по какой-то непонятной причине) генерируется с помощью синтаксических разборов, вызывает основной синтаксический анализ ошибки, прекращающий выполнение.PHP включает файлы с ошибками разбора

Есть ли способ обнаружить ошибки синтаксического анализа при включении файла, чтобы я мог динамически регенерировать этот файл?

+3

Похоже, что вам нужно для решения проблем, которые являются причиной разбора ошибок в прилагаемом скрипте. Я не уверен в их обнаружении, но если он однажды будет ошибкой, кажется, что он снова будет ошибкой, если он будет регенерирован одним и тем же методом. –

+0

Существуют и другие ситуации, в которых вы можете получить неверный файл, ситуации, такие как отказ от питания или ошибка сервера. – jab

ответ

3

Вы можете запустить версию командной строки PHP, чтобы проверить синтаксис:

php -l filename 

Если вам необходимо проверить синтаксис внутри PHP скрипта, используйте функцию exec() для вызова программы из командной строки.

Смотрите также Устаревшей функцию php_check_syntax()

+1

Это устарело после 5.0.4. –

+0

Только что заметил, что ... изменил мой ответ. –

+1

Я бы предположил, что вызов функции типа 'php_check_syntax()' будет намного быстрее, чем порождение нового процесса .. слишком плохо его ушло сейчас :( – rustyx

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 является именем файла ? –

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

ГДЕ 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); 
}