PHP включает файлы с ошибками разбора - PullRequest
1 голос
/ 10 августа 2009

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

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

Ответы [ 7 ]

3 голосов
/ 10 августа 2009

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

php -l filename

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

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

1 голос
/ 19 ноября 2010

SYNTAX.php? Filename.php

ГДЕ SYNTAX.php:

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

include($_SERVER['QUERY_STRING']);
?>
0 голосов
/ 04 февраля 2013

Если вы можете гарантировать, что вы всегда генерируете правильно анализируемый код (что должно быть легко достижимо при правильном экранировании и т. Д.), То единственный способ, которым это может пойти не так, - это когда процесс записи файла прерывается (например, питание отключение, нехватка памяти, уничтожение процесса и т. д.). В этом случае вы получите неполный файл.

Вы можете защитить от частичной записи, добавив подпись в конец файла и проверив ее наличие перед вызовом include ().

Например, если вы напишите <?php $complete=1; ?> в конце, вы можете проверить его наличие позже:

$contents = file_get_contents($path);
if (strpos($contents, '<?php $complete=1; ?>')) {
    include($path);
}
0 голосов
/ 10 марта 2010

Выполнив shell_exec (), вы можете увидеть вывод, как если бы вы выполнили этот файл из командной строки. Вы можете просто увидеть, есть ли здесь ошибка.

<?php
if (strpos(shell_exec('php -l file.php'), 'Syntax Error')) {
    die('An error!');
}
0 голосов
/ 10 августа 2009

У меня есть скрипт, который будет проходить через мое кодовое дерево и искать синтаксические ошибки. Это не очень продвинутый, но основы этого

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

Это запускает php -l для сценария, который вы собираетесь включить, и, если нет ошибок, загружает его.

0 голосов
/ 10 августа 2009

Вы можете сделать 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.
}
0 голосов
/ 10 августа 2009

Вы можете выполнить (используя exec () или аналогичный) php -l file.php и посмотреть на результат. Было бы медленно, я бы подумал сделать это при каждом включении.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...