Новое в Symfony 6.3 — Early Hints
Symfony 6.3 выйдет в конце мая 2023 года. Это первая статья из серии, в которой рассказывается о наиболее важных новых возможностях, представленных в Symfony 6.3.
Early Hints — это один из самых последних и эффективных методов улучшения воспринимаемой производительности ваших веб-сайтов и веб-приложений. Early Hints позволяют серверам сообщать браузерам, какие ресурсы (файлы CSS и JavaScript, веб-шрифты и т.д.) следует начать загружать, пока серверы всё ещё работают над созданием ответа.
С технической точки зрения, Early Hints — это ответ HTTP с кодом состояний 103
содержащий один или несколько заголовков HTTP, в которых перечислены ресурсы для загрузки или подключения. Например:
103 Early Hints
Link: <https://fonts.google.com>; rel=preconnect
Link: </main.css>; rel=preload; as=style
Link: </app.js>; rel=preload; as=script
Эти заголовки также включаются в ответ, который серверы отправят позже, чтобы ответить на запрос пользователя. Однако отправив их как можно скорее, браузеры могут начать их загрузку или подготовку к ним, что значительно улучшит воспринимаемую производительность. В статье от Cloudflare они показывают улучшения от 10% до 20% в зависимости от типа веб-сайта.
В Symfony 6.3 мы добавили поддержку Early Hints с помощью sendEarlyHints()
, определённого в AbstractController
:
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\WebLink\Link;
class HomepageController extends AbstractController
{
#[Route("/", name: "homepage")]
public function index(): Response
{
$response = $this->sendEarlyHints([
new Link(rel: 'preconnect', href: 'https://fonts.google.com'),
(new Link(href: '/main.css'))->withAttribute('as', 'stylesheet'),
(new Link(href: '/app.js'))->withAttribute('as', 'script'),
]);
// prepare the contents of the response...
return $this->render('homepage/index.html.twig', response: $response);
}
}
Метод sendEarlyHints()
создаёт и отправляет первый HTTP-ответ (с кодом состояния 103) и возвращает объект Response
, который необходимо использовать для отправки полного ответа позже. Ресурсы определяются через класс Link
предоставляемый компонентом WebLink
.
Вот и всё! Обновление контроллеров для отправки ресурсов в первую очередь ускорит загрузку ваших сайтов, что приведёт к большему количеству конверсий и более довольным посетителям. Однако есть одна загвоздка. Немногие серверы поддерживают функцию отправки сначала заголовка ответа, а затем содержимого ответа.
По состоянию на апрель 2023 года, и для приложений PHP эту функцию поддерживает только SAPI, предоставляемый PHP-сервером Franken. Надеемся, что другие веб-серверы и сервисы SaaS/PaaS вскоре добавят его поддержку.
P.S.
С 21 мая 2021 года, в репозитории php/php-src
создан Pull Request на добавление функции headers_send_early_and_clear()
для HTTP Early Hints в PHP. Возможно через несколько лет эта функция станет нативной в PHP…