Mr.KTO blog


  • Рубрики

  • Поиск

  •  
      
  • Поиск
  • реклама на mrkto.com





Run-Time Проверка Синтаксиса PHP с помощью eval

Проверяем на E_PARSE ошибки строку кода или файл

Функция языковая конструкция eval предназначена для выполнения произвольного PHP-кода из текстовой строки. В случае ошибки при парсинге строки кода она возвращает false. Иначе значение при return (null если его нет). Если мы поместим "return true;" перед остальным кодом - произойдёт только проверка синтаксиса без выполнения остального кода:

function check_syntax($code) {
    return @eval('return true;' . $code);
}
var_dump( check_syntax("echo 123") ); // выведет false, т.к. пропущена точка с запятой

Для проверки синтаксиса php-файла только добавим закрывающий php-тэг после return true; (т.к. eval начинает обработку в режиме php-script, мы переходим в html-mode):

function check_syntax_file($filename) {
    return @eval('return true; ?>' . file_get_contents($filename));
}
var_dump( check_syntax_file("php_syntax_t.php") );

Зачем?

Например, чтобы избежать падения скрипта при include-инге неизвестного (пользовательского, создаваемго автоматически) файла, или кода из БД.

Ловим E_PARSE-ошибки в любом коде

E_PARSE-ошибки внутри eval-кода нельзя поймать с помощью обычного set_error_handler(), и уж тем более использовать это, не исполняя eval-код. Поэтому мы будем ловить их, используя расширение Parsekit PECL. Примерно так:

function check_syntax_Ex($code) {
    set_error_handler("_evalErrHandler");
    parsekit_compile_string($code, $errors, PARSEKIT_QUIET);
    restore_error_handler();
    return (bool)!$errors;
}

function _evalErrHandler($errno, $errstr, $errfile, $errline)
{
	switch ($errno) {
		case E_PARSE:
			echo "Eval error ($errno) $errstr in $errfile line $errline";
			break;
	}
	return true; // don't execute PHP internal error handler
}
habrahabr.ru google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru rumarkz.ru memori.ru moemesto.ru moikrug.ru myscoop.ru mister-wong.ru rucity.com vaau.ru

Один комментарий на “Run-Time Проверка Синтаксиса PHP с помощью eval”

  1. стеклянные перегородки москва пишет:

    запомнить все...

    Проверяем на E_PARSE ошибки строку кода или файл Функция языковая конструкция eval предназначена для[...]...

Оставить комментарий