WebP уже давно перестал быть экзотикой. Он даёт меньше веса при том же качестве, а браузеры поддерживают его почти поголовно. Но если вы пишете на PHP, то наверняка сталкивались с вопросом: как правильно готовить и отдавать WebP, чтобы не сломать старый сайт и не изобретать велосипед? В этой статье разберём практические приёмы — от простой конвертации до умной отдачи с учётом возможностей браузера.

Digital-студия WNDER

Что такое WebP и зачем он нужен в PHP-проекте

WebP — это формат изображений от Google. Он использует сжатие с потерями и без потерь, поддерживает прозрачность и анимацию. Главная фишка — файлы весят на 25–35% меньше, чем JPEG или PNG при сопоставимом качестве. Для сайта это означает быстрее загрузку, меньше трафика и довольных пользователей.

В PHP работать с WebP можно двумя путями: через встроенные функции GD (начиная с PHP 7.0) или через расширение Imagick. GD проще и есть почти везде, Imagick даёт больше контроля над качеством. Мы будем использовать GD, потому что он доступен на большинстве хостингов без танцев с бубном.

Но просто конвертировать все картинки в WebP недостаточно. Нужно ещё убедиться, что браузер пользователя его понимает. Старые версии Safari, например, долгое время не дружили с WebP. Поэтому в идеале сервер должен отдавать WebP только тем, кто его поддерживает, а остальным — привычный JPEG или PNG.

Как проверить поддержку WebP браузером

Самый надёжный способ — посмотреть на заголовок Accept в HTTP-запросе. Браузер сам сообщает, какие форматы изображений он умеет отображать. Если в строке есть "image/webp", значит, можно смело отдавать WebP.

Этот метод работает в 99% случаев. Но есть нюанс: некоторые прокси и корпоративные сети могут подменять заголовки. Для критичных проектов можно дополнительно проверять User-Agent, но обычно хватает Accept.

Правило: никогда не полагайтесь только на расширение файла. Всегда проверяйте заголовок Accept — это бесплатно и надёжно.

Конвертация изображений в WebP на PHP

Самый простой способ — использовать функцию imagewebp() из GD. Она берёт ресурс изображения (созданный из JPEG, PNG или GIF) и сохраняет его в формате WebP. Вот базовый пример:

Для PNG и GIF используются соответственно imagecreatefrompng() и imagecreatefromgif(). Качество указывается от 0 до 100. Для фотографий оптимально 75–85, для графики с прозрачностью — 90–100.

Если нужно конвертировать на лету (например, при загрузке пользователем), можно совместить проверку типа файла и создание WebP. Вот функция-обёртка:

Эта функция вернёт true при успехе и false, если что-то пошло не так. Не забывайте проверять права на запись в папку назначения.

Отдача WebP через PHP с правильными заголовками

Когда WebP-файл уже есть на сервере, его можно отдать двумя способами. Первый — просто ссылаться на файл с расширением .webp в HTML. Второй — отдавать через PHP-скрипт, который подставляет нужный Content-Type. Второй способ полезен, если вы хотите динамически выбирать формат без изменения URL.

Пример скрипта, который отдаёт WebP, если браузер поддерживает, иначе — JPEG:

Обратите внимание: функция browserSupportsWebp() должна быть определена ранее. Также хорошо бы добавить кэширование — заголовки Cache-Control и ETag, чтобы не гонять файлы каждый раз.

Лайфхак: используйте параметр ?format=webp в URL для отладки. Если браузер не поддерживает WebP, скрипт всё равно отдаст JPEG, но вы сможете принудительно проверить работу WebP-ветки.

Сравнение методов и подводные камни

Давайте сведём основные параметры и функции в таблицу, чтобы было нагляднее.

Функция / параметр Назначение Рекомендации
imagewebp() Сохраняет изображение в WebP Качество 75–85 для фото, 90+ для графики
imagecreatefromjpeg/png/gif Загружает исходное изображение Проверяйте MIME-тип через getimagesize()
$_SERVER['HTTP_ACCEPT'] Определяет поддержку WebP браузером Ищите подстроку 'image/webp'
header('Content-Type: image/webp') Устанавливает правильный MIME-тип Обязательно при отдаче через PHP

Теперь о подводных камнях. Во-первых, не все сборки PHP имеют поддержку WebP в GD. Проверить можно функцией gd_info() — ищите ключ 'WebP Support'. Если его нет, придётся либо пересобирать PHP, либо использовать Imagick.

Во-вторых, при конвертации PNG с прозрачностью в WebP с потерями прозрачность может стать чёрной. Решение: использовать сжатие без потерь (imagewebp с quality=100) или предварительно накладывать белый фон.

В-третьих, не забывайте про кэширование. Если вы генерируете WebP на лету, сохраняйте результат на диск, чтобы не тратить ресурсы при каждом запросе.

Что в итоге

WebP — отличный инструмент для ускорения сайта, и PHP даёт все средства для работы с ним. Главное — проверять поддержку браузером, аккуратно конвертировать и не забывать про кэш. Начните с простой конвертации существующих изображений и постепенной отдачи через PHP — это даст быстрый выигрыш без рискованных изменений.

Если вы только начинаете, сделайте скрипт, который при загрузке картинки автоматически создаёт WebP-версию, и используйте её в с fallback на JPEG. Это безопасно и эффективно.

Студия WNDER