WebP уже давно перестал быть экзотикой. Он даёт меньше веса при том же качестве, а браузеры поддерживают его почти поголовно. Но если вы пишете на PHP, то наверняка сталкивались с вопросом: как правильно готовить и отдавать WebP, чтобы не сломать старый сайт и не изобретать велосипед? В этой статье разберём практические приёмы — от простой конвертации до умной отдачи с учётом возможностей браузера.
Что такое 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.
Конвертация изображений в 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, чтобы не гонять файлы каждый раз.
Сравнение методов и подводные камни
Давайте сведём основные параметры и функции в таблицу, чтобы было нагляднее.
| Функция / параметр | Назначение | Рекомендации |
|---|---|---|
| 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-версию, и используйте её в
Студия WNDER



