2012-08-14 6 views
8

Ну, я столкнулся с немного рассолом. Мне нужно проверить некоторые ошибки PHP для синтаксических ошибок. Я заметил это немного, что нужно для запуска из командной строки:Проверьте наличие ошибок синтаксиса PHP?

php -l somefile.php

Однако, есть способ запустить это изнутри самого PHP-файл? Я искал и думаю, что могу как-то использовать функцию parse_str, выполнив ее, введя ее в $ _GET, но не могу понять, как это работает.

Кто-то еще сказал мне использовать функцию token_get_all() php, чтобы определить это.

Но я не могу понять, как это сделать с любым подходом? Может ли кто-нибудь здесь дать мне пример кода, чтобы начать, возможно? Я не думаю, что использование eval() - это путь, хотя у меня была работа eval($code), но не думаю, что я должен запустить сценарий, если есть ошибки синтаксиса PHP.

Любая помощь на это очень ценится, как всегда!

+0

Почему бы не создать подпроцесс 'php -l'? –

+0

@arxanas - Как это можно сделать ??? Вариант ответа...? –

+0

@SolomonClosson, я думаю, что он краткий комментарий ссылается на http://php.net/manual/en/function.exec.php – Pacerier

ответ

1

php_check_syntax должен сделать трюк. Если вы используете PHP> = 5.05, см. Первый комментарий в разделе комментариев для реализации.

+3

Эта функция была удалена из PHP ... [link] (http: //www.php .net/manual/ru/function.php-check-syntax.php) –

+0

Хорошая ловушка @SolomonClosson. OP, к счастью в комментариях - это реализация, которую вы можете использовать.Я не буду вставлять его здесь, так как он очень большой, но это главный комментарий. – wanovak

+0

Это функция PHP4 и была удалена в PHP 5.0.x. Более того, это был просто псевдоним 'eval()' - он просто запускал предоставленный код для обнаружения ошибок синтаксического анализа. – mario

5

Вы могли бы просто сделать shell_exec() вроде этого:

$output = shell_exec('php -l /path/to/filename.php'); 

Это дает вывод операции командной строки в строке $output.

+0

Это дает мне ошибку '$ output is undefined'. –

+0

Итак, исправлена ​​неопределенная ошибка вывода, однако теперь она возвращает пустую строку, независимо от наличия ошибок синтаксиса PHP или нет. –

+0

Использование exec() вместо shell_exec() даст вам результат в третьем параметре: http://www.php.net/manual/en/function.exec.php –

0

Я хотел бы сделать это следующим образом:

$php_file = 'The path to your file'; 
if(substr(`php -l $php_file`, 0, 16) == 'No syntax errors') { 
    // Correct syntax 
} else { 
    // Error 
} 
0

Вы можете использовать exec, чтобы проверить на наличие ошибок синтаксиса.

$tempFile = path/of/file 
$syntaxParseError = strpos(exec('php -l '.$tempFile), 'No syntax errors detected') === false;` 

К сожалению, это не даст вам номер строки или сообщит вам что-нибудь об ошибке. Для этого вам либо потребуется установить статический анализатор на ваш сервер Is there a static code analyzer [like Lint] for PHP files?, либо написать собственный парсер.

NB. token_get_all() ничего не определит сам по себе, но это полезная функция для создания парсера.

2

Это безопаснее, чтобы проверить состояние возвращаемого php -l

$fileName = '/path/to/file.php'; 
exec("php -l {$fileName}", $output, $return); 

if ($return === 0) { 
    // Correct syntax 
} else { 
    // Syntax errors 
} 

См this fiddle, чтобы увидеть его в действии

1

Зачем использовать оболочку на всех?

function syntax_is_valid($code) 
{ 
    try 
    { 
     @eval($code); 
    } 
    catch (ParseError $e) 
    { 
     return false; 
    } 

    return true;  
} 

В качестве альтернативы используйте $e->getMessage() для получения дополнительной информации.

+0

Как вы предотвращаете все побочные эффекты от запуска (исключения) кода? Например, печать, подключение к базе данных, запись файлов и т. Д. –

Смежные вопросы