новое    архив    фото    Харьковские сети    login   


дата   26-11-2009 16:05:01



Включение условных запросов в приложениях на Zend Framework Источник: Enable your Zend Framework App with Conditional GET! Автор: Danila Vershinin Перевод: Лобач Олег В этой статье я покажу вам простой подход, позволяющий вашим приложениям на Zend Framework снизить нагрузку на каналы связи, став таким образом более дружелюбными к пользователю. Эта техника предполагает использование условного GET-запроса (HTTP conditional GET). Это базовая возможность HTTP-протокола. Посылая правильные HTTP-заголовки, ваше приложение позволяет браузерам посетителей кэшировать страницы вашего сайта. Вы беспокоитесь о посетителях, имеющих старые версии страниц в кэше? Не стоит! Предлагаемый метод позволяет получить все выгоды от кэширования на стороне клиента без внесения каких-либо изменений, и требует всего 5 минут вашего времени для ее интеграции :). Zend Framework великолепен в том, что вы можете легко расширить его. Мы собираемся создать плагин фронт-контроллера, который будет заботиться о обработке условных GET-запросов. Давайте создадим наш плагин фронт-контроллера: <?php /** * Plugin to support conditional GET for php pages (using ETag) * Should be loaded the very last in the plugins stack * * @author $Author: danila $ * @version $Id: Conditional.php 15741 2009-02-08 11:58:44Z danila $ * */ class Smartycode_Http_Conditional extends Zend_Controller_Plugin_Abstract { public function dispatchLoopShutdown() { $send_body = true; $etag = '"' . md5($this->getResponse()->getBody()) . '"'; $inm = split(',', getenv("HTTP_IF_NONE_MATCH")); $inm = str_replace('-gzip', '', $inm); // TODO If the request would, without the If-None-Match header field, // result in anything other than a 2xx or 304 status, // then the If-None-Match header MUST be ignored foreach ($inm as $i) { if (trim($i) == $etag) { $this->getResponse() ->clearAllHeaders() ->setHttpResponseCode(304) ->clearBody(); $send_body = false; break; } } $this->getResponse() ->setHeader('Cache-Control', 'max-age=7200, must-revalidate', true) ->setHeader('Expires', gmdate('D, d M Y H:i:s', time() + 2 * 3600) . ' GMT', true) ->clearRawHeaders(); if ($send_body) { $this->getResponse() ->setHeader('Content-Length', strlen($this->getResponse()->getBody())); } $this->getResponse()->setHeader('ETag', $etag, true); $this->getResponse()->setHeader('Pragma', ''); } } Подключить этот плагин к фронт-контроллеру очень легко. Так же легко, как добавление строки в загрузочный файл: $frontController->registerPlugin( new Smartycode_Http_Conditional(), 101 ); Обратите внимание на «101». Вы должны зарегистрировать плагин последним в стеке плагинов. Эти простые шаги сделают ваше приложение на Zend Framework более дружелюбным к окружению: * Работа AJAX-запросов происходит через зендовский MVC (все виды запросов) * Если страницы не изменялись со времени последнего запроса, то они не будут передаваться * Можно также полагать, что вы получите пользу для SEO — поисковые системы, поддерживающие Etag, смогут эффективно пропускать загрузку / повторный анализ страниц сайта, что ускорит индексацию страниц вашего сайта * Отправка заголовка Content-Length включает постоянные соединения (Keep-Alive connections)

добавить отзыв

дата   26-11-2009 16:27:37



http://code.google.com/p/zfdebug/ очень полезная штука. ставится с минимальной обточкой напильником

добавить отзыв

0.0011048316955566