Spec-Zone.ru › Phalcon 3

Возвращение ответов

Часть цикла 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API