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

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

Autoload будет успешно сообщать о недостающих файлах, чтобы логика приложения могла справиться с этим. Но если эти файлы повреждены, то вся обработка останавливается с пустым экраном для пользователя и «Ошибка анализа 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 )

Мысли?

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

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

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

Рассмотрение ошибок, подобных тем, которые вы хотите избежать, вероятно, не будет происходить часто, возможно, лучше … просто позвольте им произойти.
Единственная вещь: активировать журналы и следить за ними, быстро обнаруживать, когда возникает проблема 🙂

Конечно, это не мешает вам разобраться с случаем отсутствия файлов; но это другое дело …

Другой способ сделать один 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 ....... 

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

наслаждаться 🙂

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

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

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

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

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