PHP: парсинг и замена "short_open_tag"
версия для печатиРечь о тегах в php-скриптах. Согласно мануала при включенной опции разрешается короткая форма записи
Суть моей проблемы: перешел на новую версию PHP, при этом ставил его не из официальных репов, а в полуручном режиме из PPA. В новом конфиге опция short_open_tag оказалась отключена, у меня упало несколько сайтов и я подзаколебался искать причину. Учитывая, как я обновил PHP, мест для возможных багов стало более, чем достаточно.
В итоге-то я разобрался, но что меня больше всего расстраивает: PHP никак не ругается на короткий тег в шаблоне, если он запрещен настройкой. Шаблон в целом парсится, при этом могут возникнуть ошибки, которые PHP уже видит, но найти их истиную причину сложно. Еще хуже, если ошибок не возникает, а просто исчезает часть страницы, зато появляется php-код в чистом виде. Вообще красота..
Для решения траблы есть два выхода: включить опцию или исправить шаблоны и не использовать короткие теги. Я сделал консольный скрипт для правки, скачать можно на Гитхабе.
Скрипт ищет в указанном каталоге и подкаталогах файлы с заданным расширением, анализирует каждый из них на использование коротких тегов и выводит в консоль результат. Если указано юзером, заменяет короткие теги на полное представление.
Примеры использования:
// Найти короткие теги в htm-файлах в заданном каталоге и подкаталогах
short_tags_replace.php /path/to/views/
// Найти короткие теги в php-файлах
short_tags_replace.php /path/to/views/ php
// Найти короткие теги в htm-файлах и заменить из на полное представление
short_tags_replace.php /path/to/views/ htm replace
Автоконтроль
Для того, чтобы в дальнейшем уменьшить вероятность попадания на баг с короткими тегами, можно в хуках Гита запилить проверку, например, в pre-commit. Вот моя реализация:
#!/bin/sh
echo "Запуск гит-хука 'pre-commit'\n\n"
# Проверка на отстутствие коротких php-тегов в шаблонах проекта
validators_dir='/some/path/'
errors=$(
$validators_dir/short_tags_replace.php /path/to/views/ &
$validators_dir/short_tags_replace.php /another/path/to/views/
)
if [ ! -z "$errors" ]; then
echo "Не прошла проверка на отстутствие коротких php-тегов в шаблонах проекта. Лог:\n"
echo "$errors"
exit 1
fi
У меня в проекте два каталога, подлежащие проверке, поэтому два вызова скрипта.
Не забудьте разрешить выполнение для pre-commit и short_tags_replace.php. Если Гит их не сможет запустить, то никаких ошибок не будет, а коммит без проблем уйдет в реп. В этом плане Гит такой же тихушник, как и PHP с тегами.
[1oo%, EoF]Понравилась статья? Расскажите о ней друзьям: