Я загружаю динамически файлы классов 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 был хорошим.