Возвращение ответов
Часть цикла HTTP заключается в возвращении ответов клиентам. Phalcon\Http\Response — это компонент Phalcon, предназначенный для выполнения этой задачи. Ответы HTTP обычно состоят из заголовков и тела. Ниже приведён пример базового использования:
use Phalcon\Http\Response;
// Getting a response instance
$response = new 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-стек, нет необходимости создавать ответы вручную. Однако, если вам нужно вернуть ответ непосредственно из действия контроллера, следуйте этому примеру:
use Phalcon\Http\Response;
use Phalcon\Mvc\Controller;
class FeedController extends Controller
{
public function getAction()
{
// Getting a response instance
$response = new 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 its 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 = $headers->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 specifying 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(
[
"for" => "index-lang",
"lang" => "jp",
"controller" => "index",
]
);
Обратите внимание, что перенаправление не отключает компонент представления, поэтому, если представление ассоциировано с текущим действием, оно будет выполнено в любом случае. Вы можете отключить представление из контроллера, выполнив $this->view->disable();
Кэширование HTTP
Один из самых простых способов улучшить производительность приложений и сократить трафик — использование кэширования HTTP. Большинство современных браузеров поддерживают кэширование HTTP, и это одна из причин, по которой многие веб-сайты сейчас работают быстро.
Кэширование HTTP можно изменить в следующих значениях заголовков, отправляемых приложением при первом отображении страницы:
- Expires: С помощью этого заголовка приложение может задать дату в будущем или прошлом, сообщая браузеру, когда страница должна истечь.
- Cache-Control: Этот заголовок позволяет указать, как долго страница должна считаться свежей в браузере.
- Last-Modified: Этот заголовок сообщает браузеру, когда сайт был последний раз обновлён, избегая повторных запросов страницы.
- ETag: ETag — это уникальный идентификатор, который должен быть создан, включая отметку времени изменения текущей страницы.
Установка срока действия
Дата истечения срока действия — один из самых простых и эффективных способов кэширования страницы на стороне клиента (браузера). Начиная с текущей даты, мы добавляем количество времени, в течение которого страница будет храниться в кэше браузера. До истечения этой даты новые данные с сервера запрашиваться не будут:
$expiryDate = new DateTime();
$expiryDate->modify("+2 months");
$response->setExpires($expiryDate);
Компонент Response автоматически отображает дату в часовом поясе GMT, как ожидается в заголовке Expires.
Если мы установим это значение на дату в прошлом, браузер всегда будет обновлять запрошенную страницу:
$expiryDate = new DateTime();
$expiryDate->modify("-10 minutes");
$response->setExpires($expiryDate);
Браузеры полагаются на часы клиента, чтобы определить, прошла ли эта дата. Часы клиента могут быть изменены, чтобы сделать страницы просроченными, и это может ограничить данный механизм кэширования.
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");
E-Tag
«Тег сущности» или «E-Tag» — это уникальный идентификатор, который помогает браузеру понять, изменилась ли страница между двумя запросами. Идентификатор должен быть рассчитан с учётом того, что он должен измениться, если ранее предоставленное содержимое изменилось:
// Calculate the E-Tag based on the modification time of the latest news
$mostRecentDate = News::maximum(
[
"column" => "created_at"
]
);
$eTag = md5($mostRecentDate);
// Send an E-Tag header
$response->setHeader("E-Tag", $eTag);
© 2011–2017 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/latest/reference/response.html