пятница, 19 сентября 2014 г.

Гребаные слеши





Так вот - гребаные слеши. Сегодня, перенося небольшой проект на php с локальной машины (WAMP) на хостинг, наступил на грабли со слешами.

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

Началось все с того, что прекрасно работающий локально сайт на хостинге выпадал с HTTP 500. Чтобы хоть как-то понять в чем дело, пришлось включать логирование ошибок на сайте. У моего хостера эта функция включается в течение 3 часов после заявки.

Мне повезло и error.log появился где-то примерно через 30 минут, одновременно с уведомлением на почту, что я занял 369% от своей дисковой квоты (квота - 1 Gb). Это весьма меня удивило, т.к. весь сайт вместе со всеми файлами и картинками весит не больше 2 метров.

Подозрение сразу пало на злополучный лог. И правда - error.log был размером в ~3.7 гигов. Сказать, что я удивился - ничего не сказать. Выкачал я этот файл и начал искать способ его открыть. Из установленных у меня Notepad и Notepad++ с этой задачей не справился никто. Большой, видите ли, файл. После быстрого гугления выбор пал на AkelPad - весьма легковесный, но в то же время функциональный текстовый редактор.

Скачал, установил, пытаюсь открыть файл. И даже что-то открывается! Но не до конца - программа выдает ошибку нехватки памяти (а что памяти мало, это факт - на компе всего 3 Gb RAM) и просит как можно скорее прекратить ее мучения. Мизерокордии при себе не оказалось, потому я и начал изучать кусок лога, который виднелся из под ошибки. Тут-то до меня и дошло, в чем проблема.

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

Причина была в чем - php на win хорошо в синтаксисе путей к файлам работает как с прямыми слешами, так и с обратными (только эти нужно экранировать), ну а никсовые сервера работают с прямыми. Соответственно, функция fopen(), которой я пытался впарить некорректные пути к файлам, возвращала FALSE. А feof() и fread() работают только со стрингами, но уж никак не с булевым типом.

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

Так вот - гребаные слеши.