Возвращение ответов
Часть цикла HTTP заключается в возвращении ответов клиентам. Phalcon\Http\Response — это компонент Phalcon, предназначенный для выполнения этой задачи. Ответы HTTP обычно состоят из заголовков и тела. Ниже приведен пример базового использования:
//Getting a response instance
$response = new \Phalcon\Http\Response();
//Set status code
$response->setStatusCode(404, "Not Found");
//Set the content of the response
$response->setContent("Sorry, the page doesn't exist");
//Send response to the client
$response->send();
Если вы используете полную MVC-стек, вам не нужно создавать ответы вручную. Однако, если вам нужно вернуть ответ непосредственно из действия контроллера, следуйте этому примеру:
class FeedController extends Phalcon\Mvc\Controller
{
public function getAction()
{
// Getting a response instance
$response = new \Phalcon\Http\Response();
$feed = //.. load here the feed
//Set the content of the response
$response->setContent($feed->asString());
//Return the response
return $response;
}
}
Работа с заголовками
Заголовки — важная часть ответа HTTP. Они содержат полезную информацию о состоянии ответа, например, код состояния HTTP, тип ответа и многое другое.
Вы можете задавать заголовки следующим образом:
//Setting a header by it's name
$response->setHeader("Content-Type", "application/pdf");
$response->setHeader("Content-Disposition", 'attachment; filename="downloaded.pdf"');
//Setting a raw header
$response->setRawHeader("HTTP/1.1 200 OK");
Мешок Phalcon\Http\Response\Headers внутренне управляет заголовками. Этот класс извлекает заголовки перед отправкой их клиенту:
//Get the headers bag
$headers = $response->getHeaders();
//Get a header by its name
$contentType = $response->getHeaders()->get("Content-Type");
Выполнение переадресаций
С помощью Phalcon\Http\Response вы также можете выполнять переадресации HTTP:
//Redirect to the default URI
$response->redirect();
//Redirect to the local base URI
$response->redirect("posts/index");
//Redirect to an external URL
$response->redirect("http://en.wikipedia.org", true);
//Redirect specifyng the HTTP status code
$response->redirect("http://www.example.com/new-location", true, 301);
Все внутренние URI генерируются с использованием службы «url» (по умолчанию Phalcon\Mvc\Url). Этот пример демонстрирует, как выполнить переадресацию, используя маршрут, который вы определили в своем приложении:
//Redirect based on a named route
return $response->redirect(array(
"for" => "index-lang",
"lang" => "jp",
"controller" => "index"
));
Обратите внимание, что переадресация не отключает компонент представления, поэтому, если представление связано с текущим действием, оно будет выполнено. Вы можете отключить представление из контроллера, выполнив $this->view->disable();
Кэширование HTTP
Один из самых простых способов улучшить производительность ваших приложений и уменьшить трафик сервера — использование кэширования HTTP. Большинство современных браузеров поддерживают кэширование HTTP. Кэширование HTTP — одна из причин, по которой многие веб-сайты работают быстро.
Кэширование HTTP может быть изменено в следующих значениях заголовков, отправленных приложением при первом отображении страницы:
- Expires: С помощью этого заголовка приложение может установить дату в будущем или прошлом, сообщая браузеру, когда страница должна истечь.
- Cache-Control: Этот заголовок позволяет указать, сколько времени страница должна считаться актуальной в браузере.
- Last-Modified: Этот заголовок сообщает браузеру, когда сайт был обновлён в последний раз, избегая повторной загрузки страницы
- ETag: ETag — уникальный идентификатор, который должен быть создан, включая метку времени изменения текущей страницы
Установка срока действия
Дата истечения срока действия — один из самых простых и эффективных способов кэширования страницы на стороне клиента (браузера). Начиная с текущей даты, мы добавляем количество времени, в течение которого страница будет храниться в кэше браузера. До истечения этой даты новые данные с сервера запрашиваться не будут:
$expireDate = new DateTime();
$expireDate->modify('+2 months');
$response->setExpires($expireDate);
Компонент Response автоматически отображает дату в часовом поясе GMT, как ожидается в заголовке Expires.
Если мы установим это значение на дату в прошлом, браузер всегда будет обновлять запрашиваемую страницу:
$expireDate = new DateTime();
$expireDate->modify('-10 minutes');
$response->setExpires($expireDate);
Браузеры полагаются на часы клиента, чтобы оценить, прошла ли эта дата. Часы клиента можно изменить, чтобы заставить страницы истекать, и это может представлять ограничение для этого механизма кэширования.
Cache-Control
Этот заголовок предоставляет более безопасный способ кэширования страниц. Нам просто нужно указать время в секундах, сообщая браузеру, как долго он должен хранить страницу в своём кэше:
//Starting from now, cache the page for one day
$response->setHeader('Cache-Control', 'max-age=86400');
Обратный эффект (избежание кэширования страницы) достигается следующим образом:
//Never cache the served page
$response->setHeader('Cache-Control', 'private, max-age=0, must-revalidate');
ETag
«Entity-tag» или «E-tag» — уникальный идентификатор, который помогает браузеру понять, изменилась ли страница между двумя запросами. Идентификатор должен быть вычислен с учётом того, что он должен измениться, если ранее предоставленное содержимое изменилось:
//Calculate the E-Tag based on the modification time of the latest news
$recentDate = News::maximum(array('column' => 'created_at'));
$eTag = md5($recentDate);
//Send an E-Tag header
$response->setHeader('E-Tag', $eTag);
© 2011–2016 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/2.0.0/reference/response.html