Можно ли проверить синтаксис файла PHP из PHP?

Я динамически загружаю файлы классов PHP с автозагрузкой. И эти файлы могут быть потеряны или повреждены по какой-либо причине.

Автозагрузка успешно сообщит об отсутствующих файлах, чтобы логика приложения могла справиться с этим. Но если эти файлы повреждены, вся обработка останавливается с пустым экраном для пользователя и «Ошибка синтаксического анализа PHP: синтаксическая ошибка» в журнале ошибок.

Можно ли проверить синтаксис файла PHP из кода PHP?

Я посмотрел здесь: http://us.php.net/manual/en/function.php-check-syntax.php — устарело.

А также

exec("php -l $file");

кажется неверным (http://bugs.php.net/bug.php?id=46339)

Мысли?


person Oleksandr Yanovets    schedule 30.07.2009    source источник
comment
Вы действительно думаете о проверке синтаксиса каждого файла, который вы хотите включить, каждый раз, когда выполняется скрипт?   -  person Gumbo    schedule 30.07.2009
comment
Не совсем. У меня есть специальные классы, которые могут быть потенциально повреждены, но не все.   -  person Oleksandr Yanovets    schedule 30.07.2009


Ответы (4)


Вы действительно не должны пытаться проверять неправильные файлы PHP во время выполнения: это убьет время отклика вашего приложения!

«Лучшим способом» было бы использовать php -l из командной строки, когда вы закончите изменять PHP-скрипт; или включите его в процесс сборки, если вы его используете; или подключите его как хук предварительной фиксации SVN, если вы используете SVN и можете определить ловушки SVN.

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


Учитывая, что ошибки, подобные тем, которых вы хотите избежать, вероятно, будут происходить нечасто, вероятно, лучше... просто позволить им произойти.
Единственное, что нужно: активировать журналы и отслеживать их, чтобы иметь возможность быстро обнаруживать проблемы :-)


Конечно, это не мешает вам иметь дело с отсутствующими файлами; но это другое дело...

person Pascal MARTIN    schedule 30.07.2009
comment
Спасибо за Ваш ответ. Ответ нет, не с разумной производительностью является допустимым вариантом. SVN pre-commit hook — отличная идея, и я думаю, что в большинстве случаев она решит нашу проблему. - person Oleksandr Yanovets; 31.07.2009
comment
Не за что :-) Хорошо насчет хука svn pre-commit: когда вы являетесь администратором сервера SVN, хуки действительно полезны! - person Pascal MARTIN; 31.07.2009

Другой способ сделать один файл php в корневом каталоге с именем checkSyntax.php

<?php
for($i=1; $i < count($argv); $i++){
        $temp = "php -l " . $argv[$i];
        $output = exec($temp);
        echo "\n$output";
}
?>

теперь откройте файл bashrc, чтобы создать ярлык для запуска этого файла. добавьте строку ниже для запуска checkSyntax.php

alias checkSyntaxErrors='php /root/checkSyntax.php'

и теперь перейдите в исходный каталог, сделайте svn st.

он показывает вам список файлов, теперь легко запустите команду.

checkSyntaxErrors file1.php file2.php .......

это проверит все ваши файлы, передаваемые в качестве аргументов.

наслаждаться :)

person Saurabh Soni    schedule 26.04.2012

Короче говоря: я не вижу способа сделать это, но у меня есть идея, которой может быть достаточно.

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

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

В автозагрузчике у вас должен быть список или схема именования, чтобы всегда пытаться загрузить обязательные классы (другими способами ваше приложение может находиться в несогласованном состоянии)

person Csaba Kétszeri    schedule 30.07.2009
comment
Я предположил, что он (его система) не контролирует эти файлы во время сборки. - person Csaba Kétszeri; 30.07.2009
comment
Интересная идея, хотя я думаю, что нехорошо ставить проверку синтаксиса в зависимость от посещения сайта пользователем. Даже если только первый получит пустую страницу. - person Oleksandr Yanovets; 31.07.2009

Вы также можете выполнить модульное тестирование, в котором вы загружаете PHP, который вы выполняете динамически, и утверждаете, что exec("php -l $fileName") действителен. Если бы вы сделали это, вы бы смогли проверить это один раз в своих тестах, сгенерировав его с соответствующими переменными, и иметь разумный уровень уверенности в том, что ваш PHP был хорошим.

person Isaac    schedule 10.02.2014