Core Web Vitals для PHP-сайтаў: як выправіць LCP, INP і CLS
Core Web Vitals вымяраюцца ў браўзэры, але на PHP-сайце значная частка выніку вызначаецца серверам. У гэтым гайдзе - куды глядзець у першую чаргу, якія змены ў PHP, nginx і франтэндзе рухаюць лічбы і як вымяраць, не падманваючы сябе.
Коратка
- Тры метрыкі: Largest Contentful Paint ( LCP) менш 2,5 с, Interaction to Next Paint ( INP) менш 200 мс, Cumulative Layout Shift ( CLS) менш 0,1; ацэньваецца 75-й перцентиль рэальных карыстальнікаў.
- Пачніце з часу адказу сервера ( TTFB): OPcache, наладжаны пул PHP-FPM, кэш старонак або фрагментаў і CDN звычайна даюць самы вялікі выйгрыш па LCP на PHP-сайтах.
- Займіцеся LCP-элементам свядома: падбярыце памер hero-карцінкі, аддавайце WebP, дадайце
fetchpriority="high"і ніколі не лянівую загрузку. - Рэзервуйце месца пад выявы, рэкламу і ўбудаваныя блокі, каб прыбраць зрухі макета; выкарыстоўвайце
font-display: swapі перадзагрузку шрыфтоў. - Спачатку гледзіце палявыя дадзеныя ( Search Console, CrUX), потым прайграваеце праблему ў Lighthouse і панэлі Performance браўзэра.
Core Web Vitals для PHP-сайтаў - гэта не толькі тэма франтэнда. Павольная PHP-старонка можа марнаваць секунду проста на генерацыю HTML, і ніякая аптымізацыя карцінак гэтага не верне. І наадварот: хуткі сервер не дапаможа, калі найбуйную адмалёўку блакуе hero-карцінка на 1,5 МБ. Так мы падыходзім да абодвум бакам на сваіх PHP-сайтах (integrono.com працуе на PHP-FPM за nginx і Cloudflare) і ў праектах кліентаў.
Што вымяраюць Core Web Vitals
- LCP ( Largest Contentful Paint): калі адмаляваны самы вялікі бачны элемент (звычайна hero-карцінка або блок загалоўка). Добра - 2,5 секунды і менш.
- INP ( Interaction to Next Paint): як хутка старонка візуальна рэагуе на клікі, дотыку і націску клавіш за ўсё наведванне. Добра - 200 мс і менш.
- CLS ( Cumulative Layout Shift): наколькі кантэнт "скача" пры загрузцы. Добра - 0,1 і менш.
Google ацэньвае іх па палявых дадзеных рэальных карыстальнікаў Chrome, па 75-му перцэнтыля, асобна для мабільных і дэсктопа. Таму адзін павольны шаблон ці адна павольная краіна могуць праваліць усю групу. Лабараторныя прылады накшталт Lighthouse патрэбныя для адладкі, а не для выніковай адзнакі.
Крок 1. Вымярайце правільна
- Адкрыйце справаздачу Core Web Vitals у Google Search Console, каб убачыць, якія групы URL не праходзяць і па якой метрыцы.
- Праверце ў PageSpeed Insights па адным URL з кожнай праблемнай групы. Важны верхні блок «палявыя дадзеныя», а блок Lighthouse ніжэй – лабараторны тэст, які тлумачыць прычыны.
- Выкарыстоўвайце панэль Performance у Chrome DevTools з запаволеннем CPU у 4 разы і сеткай "Slow 4G", каб прайграць тыповы мабільны вопыт.
- Для сталага маніторынгу зьбірайце дадзеныя рэальных карыстальнікаў бібліятэкай
web-vitalsі дасылайце іх у аналітыку.
<script type="module">
import {onLCP, onINP, onCLS} from 'https://unpkg.com/web-vitals@4?module';
const send = (m) => navigator.sendBeacon('/vitals', JSON.stringify({
name: m.name, value: m.value, id: m.id, url: location.pathname
}));
onLCP(send); onINP(send); onCLS(send);
</script>
Крок 2. Спачатку выпраўце час адказу сервера ( TTFB)
У LCP уваходзіць час да першага байта. Калі HTML генеруецца 800 мс, траціна бюджэту ўжо выдаткавана. На PHP-сайтах асноўныя рычагі такія:
- Уключыце OPcache і пераканайцеся, што яго памеру хапае для ўсіх скрыптоў. Без яго PHP кампілюе файлы зноўку пры кожным запыце.
- Наладзьце PHP-FPM. Занадта мала воркераў ставіць запыты ў чаргу, зашмат вычэрпвае памяць. Сачыце на старонцы статусу PHP-FPM за "listen queue" і "max children reached".
- Кэшуйце старонкі цалкам для ананімных наведвальнікаў (nginx
fastcgi_cache, кэш адказаў у Laravel ці правілы кэшавання Cloudflare), а фрагменты і вынікі запытаў - у Redis. - Выпраўце павольныя запыты. Уключыце slow query log, знайдзіце патэрны N+1 і дадайце азначнікі. Старонка са 120 запытамі павольная пры любой версіі PHP.
- Абнаўляйце PHP. Новыя версіі хутчэй і эканомней па памяці.
# php.ini (production)
opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0 ; reload php-fpm on each deploy
# php-fpm pool
pm = dynamic
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6
pm.max_requests = 500
Значэнне pm.max_children лічыце ад рэальнай памяці: падзеліце памяць, якую можна аддаць PHP, на сярэдні памер працэсу воркера (глядзіце праз ps). Пры validate_timestamps=0 не забывайце перазагружаць PHP-FPM пасля кожнага дэплою, інакш у памяці застанецца стары код.
На ўзроўні вэб-сервера уключыце HTTP/2 ці HTTP/3, Brotli ці gzip і доўгія загалоўкі кэшавання для статыкі:
location ~* \.(?:css|js|webp|avif|jpg|png|svg|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
gzip on;
gzip_types text/css application/javascript application/json image/svg+xml;
Выкарыстоўвайце версійныя імёны файлаў або параметр ?v= на аснове часу змены файла, каб "immutable" ніколі не аддаваў састарэлыя рэсурсы.
Крок 3. Выпраўце LCP-элемент
Знайдзіце LCP-элемент у PageSpeed Insights або панэлі Performance у DevTools. На большасці кантэнтных старонак гэта hero-карцінка. Далей:
- Не выкарыстоўвайце для яе лянівую загрузку.
loading="lazy"на LCP-малюначку затрымлівае яе. Замест гэтага пастаўцеfetchpriority="high". - Аддавайце патрэбны памер. Малюнак 2400 px для слота 900 px – лішнія байты. Выкарыстоўвайце
srcsetіsizes. - Выкарыстоўвайце WebP або AVIF. Звычайная эканомія - ад 30 да 60 адсоткаў у параўнанні з JPEG пры падобнай якасці.
- Пазбягайце ланцужкоў. Малюнак, зададзеная фонам у CSS ці ўстаўленая JavaScript, выяўляецца позна. Пакладзіце яе ў HTML як
<img>. - Выкарыстоўвайце preconnect або свой хостынг для іншых крыніц, ад якіх залежыць LCP (шрыфты, CDN карцінак).
<img src="/images/hero-1200.webp"
srcset="/images/hero-640.webp 640w, /images/hero-1200.webp 1200w"
sizes="(max-width: 1040px) 92vw, 960px"
width="1200" height="630"
alt="Descriptive alt text"
decoding="async" fetchpriority="high">
Па такім шаблоне зроблены вокладкі артыкулаў у гэтым блогу: два памеры WebP, відавочныя памеры і высокі прыярытэт загрузкі для hero.
Крок 4. Прыбярыце зрухі макета ( CLS)
- Заўсёды задавайце
widthіheight(абоaspect-ratioу CSS) для малюнкаў, відэа і iframe, каб браўзэр рэзерваваў месца. - Рэзервуйце месца пад банеры, апавяшчэнні аб cookie і рэкламу. Устаўляйце іх у кантэйнер з фіксаванай мінімальнай вышынёй, а не ссоўвайце кантэнт пасля загрузкі.
- Шрыфты: выкарыстайце
font-display: swapціoptional, перадзагружайце асноўны файл шрыфта і рабіце subset. Падбярыце запасны шрыфт з падобнымі метрыкамі. - Не ўстаўляйце кантэнт над ужо паказаным, калі гэта не вынік дзеяння карыстальніка.
- Анімуюць праз
transformіopacity, а не праз уласцівасці, якія змяняюць макет (top,height).
Крок 5. Палепшыце INP: менш JavaScript у асноўным патоку
INP - самая новая метрыка, і PHP-распрацоўшчыкі яе часта прапускаюць, таму што сервер на яе напрамую не ўплывае. Чыннікі ляжаць у браўзэры: доўгія задачы з вялікіх бандлаў, цяжкія іншыя скрыпты (аналітыка, чат-віджэты, менеджэры тэгаў) і апрацоўшчыкі, якія сінхронна робяць занадта шмат працы.
- Правядзіце аўдыт іншых скрыптоў. Выдаліце тыя, што нікому не патрэбныя, астатнія загружайце з
deferці пасля першага ўзаемадзеяння. - Разбівайце доўгія задачы. Дзяліце працу на часткі праз
requestIdleCallback,setTimeoutабо Scheduler API, цяжкія вылічэнні выносьце ў Web Worker. - Трымайце DOM невялікім. Тысячы вузлоў запавольваюць кожнае абнаўленне.
- Пазбягайце прымусовых сінхронных пераразлікаў макета ў цыклах (чаргаванне чытання і запісы ўласцівасцей макета).
- Паказвайце імгненную зваротную сувязь (стан націску ці індыкатар) да пачатку павольнай працы.
Крок 6. Замацуеце вынік падчас дэплояў
Прадукцыйнасць дэградуе незаўважна: новы тэг, цяжэйшая вокладка, лішні запыт на галоўнай. Дадайце Lighthouse CI або рэгулярную праверку праз PageSpeed API для пяці найважнейшых шаблонаў, задайце бюджэты ( LCP, агульны памер JS, вага малюнкаў) і наладзьце абвесткі аб перавышэнні. Параўноўвайце TTFB да і пасля кожнага рэлізу: калі ён падскочыў, прычына амаль заўсёды ў запыце ці кэшы, які перастаў спрацоўваць.
Рэалістычны парадак работ
- Вымерайце палявыя дадзеныя і вызначыце праблемныя групы URL.
- Уключыце OPcache, перагледзьце налады PHP-FPM, дадайце кэш цэлых старонак для ананімнага трафіку.
- Выпраўце hero-карцінкі: фармат, памер, прыярытэт, памеры.
- Зарэзервуйце месца для ўсяго, што загружаецца позна.
- Скароціце і адкладзяце JavaScript, прыбярыце непатрэбныя іншыя скрыпты.
- Вымерайце паўторна праз 28 дзён: палявыя дадзеныя - слізгальнае акно.
Паляпшэнні будуць з'яўляцца ў Search Console паступова: справаздача выкарыстоўвае прыкладна апошнія 28 дзён, таму выпраўленне, выпампаванае сёння, цалкам выявіцца прыкладна праз месяц.
Чым мы можам дапамагчы
Мы займаемся прадукцыйнасцю PHP і Laravel праектаў у рамках тэхнічнага SEO і асобнымі працамі: кэш, запыты, выявы і праўкі фронтэнда прама ў кодзе. Калі жадаеце зразумець, якія з змен вышэй акупяцца менавіта на вашым сайце, запішыцеся на кансультацыю або аналіз сервера. Больш за шырокі чэк-ліст па сканаванні і індэксацыі - у артыкуле тэхнічны SEO-аўдыт.
Частыя пытанні
Якія значэнні Core Web Vitals лічацца добрымі?
LCP 2,5 секунды і менш, INP 200 мілісекунд і менш і CLS 0,1 і менш, па 75-му перцентилю рэальных наведванняў.
Ці ўплываюць Core Web Vitals на пазіцыі ў Google?
Яны ўваходзяць у сігналы page experience і з'яўляюцца фактарам ранжыравання ўмеранай вагі. Рэлевантнасць і кантэнт важней, але павольная ці нестабільная старонка горш канвертуе, і для бізнэсу гэта часта даражэй.
Як PHP ўплывае на Core Web Vitals ?
У асноўным праз час адказу сервера ( TTFB), якое ўваходзіць у LCP. Яго зніжаюць OPcache, наладжаны PHP-FPM, кэшаванне, хуткія запыты і актуальная версія PHP. На INP і CLS PHP напрамую не ўплывае, яны залежаць ад фронтэнд-кода і вёрсткі.
Чаму PageSpeed Insights паказвае не тыя лічбы, што Search Console ?
PageSpeed Insights паказвае лабараторны тэст аднаго URL плюс палявыя дадзеныя, калі яны ёсць, а Search Console - палявыя дадзеныя па групах URL прыкладна за 28 дзён. Аб поспеху судзіце па палявых дадзеных.
Праз колькі паляпшэнні з'явяцца ў Search Console ?
Справаздача Core Web Vitals выкарыстоўвае слізгальнае акно ў 28 дзён рэальных дадзеных, таму поўны эфект выпраўлення відаць прыкладна праз чатыры тыдні.
Бясплатны званок для выяўлення
Прынясіце бязладны стэк ці завіслую інтэграцыю - Integrono намячае самы разумны першы крок.
Вы атрымліваеце экспертную ацэнку бюджэтных пастак, залежнасцей і таго, ці варта купляць, склейваць ці будаваць - да пачатку платнай працы. CEO застаецца ў кантуры.