25 дек. 2008 г.

Как навести порядок (или беспорядок) в php

Наткнулся на любопытный материал на хабре. В нём автор показывает как можно привести в порядок работу со стандартными функциями php на примере создания класса "массив" и "строка". В качестве методов автор просто делает обёртку стандартных функций, устраняя при этом неоднородность их вызова и возврата; например одна функция возвращает значение по-нормальному, а другая пишет в параметр, переданный по ссылке. Достойная идея. Жаль только, что это достаточно "костыльный" метод наведения порядка, который может породить еще больший беспорядок. Я боюсь представить, что мне придется разбираться в коде, который использует такой самописный враппер. А если до меня было несколько разработчиков - пиши пропало. У каждого своё видение "правильной" работы класса и в итоге получится беспорядок в инструменте, который вроде бы должен был навести порядок в другом беспорядке. Воистину чтобы понять рекурсию надо понять рекурсию =).

23 дек. 2008 г.

Last-modified и обработка if-modified-since в php

Опишу решение, призваное сообщать поисковикам и браузерам, что страница не менялась и заново её загружать не нужно. Не так давно столкнулся с тем, что гугл и яндекс часто заходят на страницы сайта, которые не менялись, в то время, как по новым ссылкам не проходят. Заключил, что за сессию суточного скана бот исчерпывает лимит скачиваемых страниц и уходит. В файле sitemap я указал наиболее приоритетной главную страницу и несколько внутренних, вот с них-то обычно и начиналось сканирование сайта и до новых страниц зачастую не доходило. Решил проблему добавлением корректной обработки заголовков HTTP If-modified-since и Last-modified. Итак, в качестве пример приведу стандартную ситуацию: главная страница сайта содержит последнюю новость, и ссылки на другие разделы сайта, добавляемые вручную (для примера) в шаблон. Значит дата последнего изменения страницы - это максимальная дата из дат изменения новостей или шаблона. Оговорюсь сразу, что в HTTP принят определённый формат дат, так что надо позаботиться о корректной выдаче даты.
$news_modified = CNews::getLastDate()  // Некий метод, получающий дату последнего изменения новостей
$template_modified = filemtime('some_templates_dir/some_template.tpl');  // Получение даты последнего изменения файла шаблона
$modified = gmdate("D, d M Y H:i:s",$md)." GMT"; // Приведение к HTTPшному формату RFC 822

$hdr = isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])?$_SERVER['HTTP_IF_MODIFIED_SINCE']:'' ; //Получение заголовка If-modofied-since в случае его наличия

if ($hdr === $modified) {
// Если даты совпадают, то контент не отдаём
  header ("HTTP/1.1 304 Not Modified ");
header ("Last-Modified: $modified");
header ("Expires:");
header ("Cache-Control:");
exit();
}
header ("Last-Modified: $modified");
header ("Expires:");
header ("Cache-Control:");
Обратите внимание, что проверка делается не на "меньше либо равно", а именно на равенство дат, ибо на клиенте может храниться только дата, которую мы передавали ему ранее в заголовке Last-modified. После введения такой обработки индексация подскочила за неделю до 90%, тогда как до этого была равна 80%. Все вышеописанное делалось на проекте bookcare.ru

17 дек. 2008 г.

С бубном

Здесь можно будет понаблюдать зажигательные пляски с бубном.