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Обратите внимание, что проверка делается не на "меньше либо равно", а именно на равенство дат, ибо на клиенте может храниться только дата, которую мы передавали ему ранее в заголовке Last-modified. После введения такой обработки индексация подскочила за неделю до 90%, тогда как до этого была равна 80%. Все вышеописанное делалось на проекте bookcare.ru$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:");
Ярлыки:
http,
if-modified-since,
php,
seo
17 дек. 2008 г.
Подписаться на:
Сообщения (Atom)