TTFB : Pourquoi le Time To First Byte est important tant pour le SEO que pour les LLM

Le Time To First Byte (TTFB) est l'un des indicateurs de performance les plus critiques, et pourtant les plus négligés, pour les sites Internet. Alors que la plupart des gens se concentrent sur le temps de chargement des pages ou le rendu visuel, le TTFB est le premier indicateur de la réactivité de votre site — et cela compte tant pour les moteurs de recherche que pour les robots d'indexation d'IA. Un TTFB lent peut signifier que les systèmes d'IA explorent moins de pages, classent votre contenu avec une priorité inférieure ou abandonnent complètement l'indexation de votre site. Ce guide explique ce qu'est le TTFB, pourquoi il est important et comment l'optimiser.

TTFB : Pourquoi le Time To First Byte est important tant pour le SEO que pour les LLM

Publié le

Auteur

Jakob Langemark

Suivez-nous

TTFB : Pourquoi le Time To First Byte est important pour le SEO et les LLM

Le Time To First Byte (TTFB) est l'une des mesures de performance les plus critiques, bien que souvent négligée, pour les sites web. Alors que la plupart se concentrent sur le temps de chargement des pages ou le rendu visuel, le TTFB est le premier indicateur de la réactivité de votre site — et cela compte tant pour les moteurs de recherche que pour les robots d'indexation d'IA. Un TTFB lent peut signifier que les systèmes d'IA explorent moins de pages, accordent une priorité moindre à votre contenu ou renoncent complètement à explorer votre site. Ce guide explique ce qu'est le TTFB, pourquoi il est important et comment l'optimiser.

Qu'est-ce que le TTFB ?

Le Time To First Byte (TTFB) est le temps qui s'écoule entre le moment où un navigateur/robot d'exploration envoie une requête HTTP et celui où il reçoit le premier octet de données du serveur.

Composants du TTFB :

  1. Résolution DNS — Temps nécessaire pour traduire le nom de domaine en adresse IP

  2. Temps de connexion — Temps nécessaire pour établir la connexion TCP

  3. Handshake SSL/TLS — Temps nécessaire pour établir la connexion HTTPS (le cas échéant)

  4. Temps de traitement du serveur — Temps que prend le serveur pour générer la réponse

  5. Latence réseau — Temps nécessaire pour que le premier octet fasse le chemin retour

Formule :

TTFB vs autres indicateurs

Le TTFB mesure la réactivité du serveur avant l'envoi de tout contenu.

Le FCP (First Contentful Paint) mesure le moment où le premier contenu visuel s'affiche.

Le LCP (Largest Contentful Paint) mesure le moment où l'élément principal est chargé.

Le TTFB intervient en premier — il est la base de toutes les autres mesures de chargement.

Pourquoi le TTFB est important pour les robots d'IA

1. Budgets d'exploration

Les robots d'IA (et les moteurs de recherche) ont un temps limité par site. Si votre TTFB est lent, ils explorent moins de pages avant que leur budget temps ne soit épuisé.

Exemple :

  • Site A : TTFB = 200 ms → Le robot parvient à explorer 500 pages en 5 minutes

  • Site B : TTFB = 2000 ms → Le robot ne parvient à explorer que 150 pages en 5 minutes

Le site A obtient une couverture d'exploration 3 fois supérieure.

2. Priorisation de l'exploration

Les robots privilégient les sites rapides. Si votre TTFB est constamment lent, les robots :

  • Reviendront moins fréquemment

  • Exploreront moins de pages par visite

  • Donneront la priorité aux sites des concurrents

3. Qualité des données

Un TTFB trop long peut entraîner des expirations de délai (timeouts). L'IA obtient des données incomplètes ou abandonne tout simplement.

Recommandations de Google :

  • Bon TTFB : < 600 ms

  • TTFB acceptable : 600 ms - 1200 ms

  • Mauvais TTFB : > 1200 ms

Il en va de même pour les robots d'exploration d'IA.

Pourquoi le TTFB est également important pour le SEO

Google a confirmé que le TTFB est indirectement un facteur de positionnement via les Core Web Vitals (il affecte le LCP).

Impact :

  • TTFB lent → LCP lent → Moins bon classement

  • TTFB rapide → LCP rapide → Meilleur classement

Mesurer votre TTFB actuel

Outils de développement du navigateur (Chrome)

  1. Ouvrez les outils de développement de Chrome (F12)

  2. Allez dans l'onglet Réseau (Network)

  3. Actualisez la page

  4. Cliquez sur la première requête (généralement votre document HTML)

  5. Consultez l'onglet Chronométrage (Timing)

Vous verrez :




PageSpeed Insights

  1. Allez sur https://pagespeed.web.dev/

  2. Saisissez votre URL

  3. Consultez le « Temps de réponse du serveur » sous la section diagnostics

WebPageTest

  1. Allez sur https://www.webpagetest.org/

  2. Saisissez votre URL et sélectionnez le lieu du test

  3. Consultez le « Time to First Byte » dans les résultats

WebPageTest indique également :

  • Le TTFB par requête (pas seulement pour le premier document HTML)

  • Le détail pour le DNS, la connexion, le SSL, l'attente

Test en ligne de commande avec curl

# Mesurer le TTFB
curl -o /dev/null -s -w "DNS: %{time_namelookup}s\nConnexion: %{time_connect}s\nSSL: %{time_appconnect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" https://ditwebsite.dk/

# Résultat :
# DNS: 0.015s
# Connexion: 0.045s
# SSL: 0.132s
# TTFB: 0.456s
# Total: 0.612s
# Mesurer le TTFB
curl -o /dev/null -s -w "DNS: %{time_namelookup}s\nConnexion: %{time_connect}s\nSSL: %{time_appconnect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" https://ditwebsite.dk/

# Résultat :
# DNS: 0.015s
# Connexion: 0.045s
# SSL: 0.132s
# TTFB: 0.456s
# Total: 0.612s
# Mesurer le TTFB
curl -o /dev/null -s -w "DNS: %{time_namelookup}s\nConnexion: %{time_connect}s\nSSL: %{time_appconnect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" https://ditwebsite.dk/

# Résultat :
# DNS: 0.015s
# Connexion: 0.045s
# SSL: 0.132s
# TTFB: 0.456s
# Total: 0.612s

Script Python pour tester en masse

import requests
import time

def measure_ttfb(url):
    start = time.time()
    r = requests.get(url, stream=True)
    ttfb = time.time() - start
    return ttfb * 1000  # Convertir en millisecondes

urls = [
    "https://ditwebsite.dk/",
    "https://ditwebsite.dk/products/",
    "https://ditwebsite.dk/blog/"
]

for url in urls:
    ttfb = measure_ttfb(url)
    print(f"{url}: {ttfb:.2f}ms")
import requests
import time

def measure_ttfb(url):
    start = time.time()
    r = requests.get(url, stream=True)
    ttfb = time.time() - start
    return ttfb * 1000  # Convertir en millisecondes

urls = [
    "https://ditwebsite.dk/",
    "https://ditwebsite.dk/products/",
    "https://ditwebsite.dk/blog/"
]

for url in urls:
    ttfb = measure_ttfb(url)
    print(f"{url}: {ttfb:.2f}ms")
import requests
import time

def measure_ttfb(url):
    start = time.time()
    r = requests.get(url, stream=True)
    ttfb = time.time() - start
    return ttfb * 1000  # Convertir en millisecondes

urls = [
    "https://ditwebsite.dk/",
    "https://ditwebsite.dk/products/",
    "https://ditwebsite.dk/blog/"
]

for url in urls:
    ttfb = measure_ttfb(url)
    print(f"{url}: {ttfb:.2f}ms")

Identifier les causes d'un TTFB lent

Le TTFB se décompose en plusieurs étapes. Identifiez les goulots d'étranglement :

1. Résolution DNS (devrait être < 20 ms)

Problème : Résolveur DNS lent.

Test :

Solution :

  • Utiliser un fournisseur de DNS rapide (Cloudflare DNS, Google DNS)

  • Activer la pré-lecture DNS (DNS prefetching) :

<link rel="dns-prefetch" href="//ditwebsite.dk">
<link rel="dns-prefetch" href="//ditwebsite.dk">
<link rel="dns-prefetch" href="//ditwebsite.dk">

2. Temps de connexion (devrait être < 50 ms)

Problème : Distance géographique par rapport au serveur ou réseau lent.

Solution :

  • Utiliser un réseau de diffusion de contenu (CDN) pour vous rapprocher des utilisateurs/robots d'exploration

  • Réduire le nombre de connexions (l'HTTP/2 aide sur ce point)

3. Handshake SSL/TLS (devrait être < 100 ms)

Problème : Négociation SSL lente.

Test :

openssl s_time -connect ditwebsite.dk:443 -www
openssl s_time -connect ditwebsite.dk:443 -www
openssl s_time -connect ditwebsite.dk:443 -www

Solution :

  • Activer TLS 1.3 (établissement de liaison plus rapide)

  • Utiliser l'agrafage OCSP (OCSP stapling)

  • Activer HTTP/2 ou HTTP/3

4. Temps de traitement du serveur (devrait être < 200 ms)

Problème : Backend ou requêtes de base de données lents.

C'est généralement le principal goulot d'étranglement.

Identifier :

  • Vérifier les journaux du serveur (logs) pour repérer les requêtes lentes

  • Utiliser des outils APM (New Relic, Datadog)

  • Analyser le profil des requêtes de base de données

Optimiser le temps de traitement du serveur

C'est ici que l'impact sera le plus important.

1. Mettre en place la mise en cache

Mise en cache côté serveur :

Utilisez Redis ou Memcached pour mettre en cache les résultats de la base de données.

Exemple (PHP avec Redis) :

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$cache_key = 'homepage_data';
$data = $redis->get($cache_key);

if (!$data) {
    // Les données ne sont pas en cache, récupération depuis la base de données
    $data = fetch_from_database();
    $redis->setex($cache_key, 3600, serialize($data));  // Cache pendant 1 heure
} else {
    $data = unserialize($data);
}

echo json_encode($data);

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$cache_key = 'homepage_data';
$data = $redis->get($cache_key);

if (!$data) {
    // Les données ne sont pas en cache, récupération depuis la base de données
    $data = fetch_from_database();
    $redis->setex($cache_key, 3600, serialize($data));  // Cache pendant 1 heure
} else {
    $data = unserialize($data);
}

echo json_encode($data);

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$cache_key = 'homepage_data';
$data = $redis->get($cache_key);

if (!$data) {
    // Les données ne sont pas en cache, récupération depuis la base de données
    $data = fetch_from_database();
    $redis->setex($cache_key, 3600, serialize($data));  // Cache pendant 1 heure
} else {
    $data = unserialize($data);
}

echo json_encode($data);

Mise en cache de page entière (Full-page caching) :

Mettez en cache l'intégralité des réponses HTML.

Exemple avec Nginx :

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;

server {
    location / {
        proxy_cache my_cache;
        proxy_cache_valid 200 60m;
        proxy_cache_key "$scheme$request_method$host$request_uri";
        proxy_pass http

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;

server {
    location / {
        proxy_cache my_cache;
        proxy_cache_valid 200 60m;
        proxy_cache_key "$scheme$request_method$host$request_uri";
        proxy_pass http

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;

server {
    location / {
        proxy_cache my_cache;
        proxy_cache_valid 200 60m;
        proxy_cache_key "$scheme$request_method$host$request_uri";
        proxy_pass http

2. Optimiser les requêtes de base de données

Problème : Requêtes N+1 ou requêtes non indexées.

Identifier les requêtes lentes (MySQL) :

-- Activer le journal des requêtes lentes
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;  -- Requêtes de plus d'une seconde

-- Afficher les requêtes lentes
SELECT * FROM

-- Activer le journal des requêtes lentes
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;  -- Requêtes de plus d'une seconde

-- Afficher les requêtes lentes
SELECT * FROM

-- Activer le journal des requêtes lentes
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;  -- Requêtes de plus d'une seconde

-- Afficher les requêtes lentes
SELECT * FROM

Solutions :

  • Ajouter des index :

-- Avant : Parcours complet de la table
SELECT * FROM products WHERE category = 'electronics';

-- Après : Créer un index
CREATE INDEX idx_category ON products(category)

-- Avant : Parcours complet de la table
SELECT * FROM products WHERE category = 'electronics';

-- Après : Créer un index
CREATE INDEX idx_category ON products(category)

-- Avant : Parcours complet de la table
SELECT * FROM products WHERE category = 'electronics';

-- Après : Créer un index
CREATE INDEX idx_category ON products(category)

  • Utiliser le cache de requêtes :

-- Activer la mise en cache des requêtes (MySQL 5.7)
SET GLOBAL query_cache_size = 67108864;  -- 64 Mo
SET GLOBAL query_cache_type = ON

-- Activer la mise en cache des requêtes (MySQL 5.7)
SET GLOBAL query_cache_size = 67108864;  -- 64 Mo
SET GLOBAL query_cache_type = ON

-- Activer la mise en cache des requêtes (MySQL 5.7)
SET GLOBAL query_cache_size = 67108864;  -- 64 Mo
SET GLOBAL query_cache_type = ON

  • Optimiser les requêtes de jointure (JOINs) :

-- Mauvais : Plus de jointures sans index appropriés
SELECT * FROM orders
JOIN users ON orders.user_id = users.id
JOIN products ON orders.product_id = products.id
WHERE users.country = 'DK';

-- Bon : Ajouter des index composites
CREATE INDEX idx_user_country ON users(country, id);
CREATE INDEX idx_product_id ON products(id)

-- Mauvais : Plus de jointures sans index appropriés
SELECT * FROM orders
JOIN users ON orders.user_id = users.id
JOIN products ON orders.product_id = products.id
WHERE users.country = 'DK';

-- Bon : Ajouter des index composites
CREATE INDEX idx_user_country ON users(country, id);
CREATE INDEX idx_product_id ON products(id)

-- Mauvais : Plus de jointures sans index appropriés
SELECT * FROM orders
JOIN users ON orders.user_id = users.id
JOIN products ON orders.product_id = products.id
WHERE users.country = 'DK';

-- Bon : Ajouter des index composites
CREATE INDEX idx_user_country ON users(country, id);
CREATE INDEX idx_product_id ON products(id)

3. Améliorer les ressources du serveur

Vérifier la charge du serveur :

top
# Voir l'utilisation du processeur et de la mémoire

htop
# Alternative plus conviviale
top
# Voir l'utilisation du processeur et de la mémoire

htop
# Alternative plus conviviale
top
# Voir l'utilisation du processeur et de la mémoire

htop
# Alternative plus conviviale

En cas de charge constamment élevée (>80% CPU) :

  • Augmenter la puissance du processeur (CPU)

  • Ajouter plus de mémoire RAM

  • Utiliser la répartition de charge (load balancing)

4. Utiliser un CDN

Les réseaux de diffusion de contenu (CDN) mettent en cache le contenu géographiquement à proximité des utilisateurs et des robots d'exploration.

CDNs populaires :

  • Cloudflare — Version gratuite disponible, excellente pour les sites de petite et moyenne taille

  • AWS CloudFront — Hautement évolutif

  • Fastly — Excellentes performances, plus technique

  • BunnyCDN — Économique

Comment un CDN améliore le TTFB :

Sans CDN :

  • Un utilisateur aux États-Unis demande un site hébergé en Europe

  • TTFB = 500 ms (200 ms de latence réseau + 300 ms de traitement serveur)

Avec CDN :

  • Un utilisateur aux États-Unis envoie une requête → Serveur edge du CDN aux États-Unis

  • TTFB = 150 ms (20 ms de latence réseau + 130 ms de hit cache)

5. Activer la compression Gzip/Brotli

La compression réduit la taille des réponses, ce qui accélère le temps de transfert.

Configuration Nginx :

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 256;
gzip_comp_level 6;

# Encore mieux : Brotli
brotli on;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 256;
gzip_comp_level 6;

# Encore mieux : Brotli
brotli on;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 256;
gzip_comp_level 6;

# Encore mieux : Brotli
brotli on;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text

Configuration Apache :

<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
</IfModule>
<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
</IfModule>
<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
</IfModule>

6. Réduire le traitement côté serveur

Minimiser :

  • Les calculs lourds à chaque requête

  • Les appels d'API externes

  • Les opérations d'E/S sur les fichiers (File I/O)

Exemple (Python Flask) :

from flask import Flask, render_template
from functools import lru_cache
import requests

app = Flask(__name__)

# Mauvais : Appel API externe à chaque requête
@app.route('/weather')
def weather_bad():
    response = requests.get('https://api.weather.com/data')
    return render_template('weather.html', data=response.json())

# Bon : Mettre en cache l'appel API externe
@lru_cache(maxsize=128)
def fetch_weather_cached():
    response = requests.get('https://api.weather.com/data')
    return response.json()

@app.route('/weather')
def weather_good():
    data = fetch_weather_cached()
    return render_template('weather.html', data=data)
from flask import Flask, render_template
from functools import lru_cache
import requests

app = Flask(__name__)

# Mauvais : Appel API externe à chaque requête
@app.route('/weather')
def weather_bad():
    response = requests.get('https://api.weather.com/data')
    return render_template('weather.html', data=response.json())

# Bon : Mettre en cache l'appel API externe
@lru_cache(maxsize=128)
def fetch_weather_cached():
    response = requests.get('https://api.weather.com/data')
    return response.json()

@app.route('/weather')
def weather_good():
    data = fetch_weather_cached()
    return render_template('weather.html', data=data)
from flask import Flask, render_template
from functools import lru_cache
import requests

app = Flask(__name__)

# Mauvais : Appel API externe à chaque requête
@app.route('/weather')
def weather_bad():
    response = requests.get('https://api.weather.com/data')
    return render_template('weather.html', data=response.json())

# Bon : Mettre en cache l'appel API externe
@lru_cache(maxsize=128)
def fetch_weather_cached():
    response = requests.get('https://api.weather.com/data')
    return response.json()

@app.route('/weather')
def weather_good():
    data = fetch_weather_cached()
    return render_template('weather.html', data=data)

7. Passer à HTTP/2 ou HTTP/3

L'HTTP/2 permet le multiplexage, ce qui réduit la surcharge liée aux connexions.

Activer HTTP/2 (Nginx) :

server {
    listen 443 ssl http2;
    server_name ditwebsite.dk;
    # ... reste de la configuration

server {
    listen 443 ssl http2;
    server_name ditwebsite.dk;
    # ... reste de la configuration

server {
    listen 443 ssl http2;
    server_name ditwebsite.dk;
    # ... reste de la configuration

Tester si HTTP/2 est activé :

curl -I --http2 https://ditwebsite.dk/
# Rechercher "HTTP/2 200" dans la réponse
curl -I --http2 https://ditwebsite.dk/
# Rechercher "HTTP/2 200" dans la réponse
curl -I --http2 https://ditwebsite.dk/
# Rechercher "HTTP/2 200" dans la réponse

Optimiser spécifiquement pour les robots d'IA

1. Prioriser les pages importantes

Assurez-vous que vos pages les plus importantes (page d'accueil, produits phares, articles principaux) bénéficient du TTFB le plus rapide.

Nginx : Cache distinct pour les pages clés :

location = / {
    proxy_cache_valid 200 120m;  # Cache page d'accueil pendant 2 heures
    proxy_pass http://backend;
}

location /products/ {
    proxy_cache_valid 200 60m;  # Cache produits pendant 1 heure
    proxy_pass http

location = / {
    proxy_cache_valid 200 120m;  # Cache page d'accueil pendant 2 heures
    proxy_pass http://backend;
}

location /products/ {
    proxy_cache_valid 200 60m;  # Cache produits pendant 1 heure
    proxy_pass http

location = / {
    proxy_cache_valid 200 120m;  # Cache page d'accueil pendant 2 heures
    proxy_pass http://backend;
}

location /products/ {
    proxy_cache_valid 200 60m;  # Cache produits pendant 1 heure
    proxy_pass http

2. Détecter et adapter pour les robots

Servir une version mise en cache aux robots d'exploration :

<?php
$user_agent = $_SERVER['HTTP_USER_AGENT'];

$is_crawler = preg_match('/GPTBot|ClaudeBot|CCBot|Googlebot|bingbot/i', $user_agent);

if ($is_crawler) {
    // Servir le HTML statique mis en cache
    echo file_get_contents('/cache/static_page.html');
} else {
    // Servir le contenu dynamique
    include('dynamic_page.php');
}

<?php
$user_agent = $_SERVER['HTTP_USER_AGENT'];

$is_crawler = preg_match('/GPTBot|ClaudeBot|CCBot|Googlebot|bingbot/i', $user_agent);

if ($is_crawler) {
    // Servir le HTML statique mis en cache
    echo file_get_contents('/cache/static_page.html');
} else {
    // Servir le contenu dynamique
    include('dynamic_page.php');
}

<?php
$user_agent = $_SERVER['HTTP_USER_AGENT'];

$is_crawler = preg_match('/GPTBot|ClaudeBot|CCBot|Googlebot|bingbot/i', $user_agent);

if ($is_crawler) {
    // Servir le HTML statique mis en cache
    echo file_get_contents('/cache/static_page.html');
} else {
    // Servir le contenu dynamique
    include('dynamic_page.php');
}

3. Préchauffer le cache avant la visite des robots

Si vous connaissez le moment où les robots d'exploration effectuent leurs visites (par exemple, après avoir soumis un sitemap), préchauffez le cache :

#!/bin/bash
# Préchauffer le cache en appelant toutes les URLs
while read url; do
  curl -s "$url" > /dev/null
done

#!/bin/bash
# Préchauffer le cache en appelant toutes les URLs
while read url; do
  curl -s "$url" > /dev/null
done

#!/bin/bash
# Préchauffer le cache en appelant toutes les URLs
while read url; do
  curl -s "$url" > /dev/null
done

Surveiller le TTFB en continu

Mettre en place un outil de surveillance automatisé

Pingdom :

  1. Créez un compte sur pingdom.com

  2. Ajoutez des vérifications d'URL

  3. Définissez un seuil d'alerte (p. ex., « alerter si TTFB > 800 ms »)

UptimeRobot :

  1. Surveillance gratuite toutes les 5 minutes

  2. Alertes par e-mail

Script personnalisé (cron job) :

#!/bin/bash
# Vérifier le TTFB et alerter s'il dépasse 1000ms
TTFB=$(curl -o /dev/null -s -w '%{time_starttransfer}' https://ditwebsite.dk/)
TTFB_MS=$(echo "$TTFB * 1000" | bc)

if (( $(echo "$TTFB_MS > 1000" | bc -l) )); then
  echo "TTFB trop élevé : ${TTFB_MS}ms" | mail -s "Alerte TTFB" admin@ditwebsite.dk
fi
#!/bin/bash
# Vérifier le TTFB et alerter s'il dépasse 1000ms
TTFB=$(curl -o /dev/null -s -w '%{time_starttransfer}' https://ditwebsite.dk/)
TTFB_MS=$(echo "$TTFB * 1000" | bc)

if (( $(echo "$TTFB_MS > 1000" | bc -l) )); then
  echo "TTFB trop élevé : ${TTFB_MS}ms" | mail -s "Alerte TTFB" admin@ditwebsite.dk
fi
#!/bin/bash
# Vérifier le TTFB et alerter s'il dépasse 1000ms
TTFB=$(curl -o /dev/null -s -w '%{time_starttransfer}' https://ditwebsite.dk/)
TTFB_MS=$(echo "$TTFB * 1000" | bc)

if (( $(echo "$TTFB_MS > 1000" | bc -l) )); then
  echo "TTFB trop élevé : ${TTFB_MS}ms" | mail -s "Alerte TTFB" admin@ditwebsite.dk
fi

Lancer toutes les heures :

crontab -e
# Ajouter :
0

crontab -e
# Ajouter :
0

crontab -e
# Ajouter :
0

Objectifs de TTFB

Recommandations de Google

  • Bon : < 600 ms

  • À améliorer : 600 ms - 1200 ms

  • Médiocre : > 1200 ms

Pour les robots d'IA (recommandations)

  • Excellent : < 300 ms (bénéficie de la priorité d'exploration la plus haute)

  • Bon : 300 ms - 600 ms (rythme d'exploration normal)

  • Acceptable : 600 ms - 1000 ms (rythme d'exploration plus bas)

  • Médiocre : > 1000 ms (risque d'une indexation incomplète)

Problèmes courants de TTFB et solutions

Problème

Symptôme

Solution

Aucun cache

TTFB > 1000 ms sur toutes les requêtes

Mettre en place Redis/Memcached

Base de données lente

TTFB élevé sur les pages dynamiques

Ajouter des index, optimiser les requêtes

Pas de CDN

TTFB élevé pour le trafic international

Activer Cloudflare ou AWS CloudFront

Surcharge serveur

Pics de TTFB lors des hausses de trafic

Augmenter les ressources serveur ou ajouter un load balancer

Code non optimisé

TTFB irrégulier

Analyser le code, éliminer les goulots d'étranglement

Appels d'API externes

TTFB élevé et instable

Mettre en cache les réponses API, utiliser des appels asynchrones

Liste de contrôle pour la mise en œuvre

Utilisez cette liste de contrôle pour améliorer votre TTFB :

  1. Mesurer le TTFB de référence — Utiliser PageSpeed Insights ou WebPageTest

  2. Identifier le goulot d'étranglement — DNS, connexion, SSL ou traitement serveur ?

  3. Mettre en place le cache côté serveur — Redis/Memcached pour les résultats de la base de données

  4. Activer la mise en cache complète — Pour les pages statiques ou semi-statiques

  5. Optimiser les requêtes de base de données — Ajouter des index, éliminer les requêtes N+1

  6. Activer Gzip/Brotli — Compresser les réponses

  7. Utiliser un CDN — Cloudflare, AWS CloudFront ou BunnyCDN

  8. Activer HTTP/2 — Réduire la surcharge liée à la connexion

  9. Surveiller le TTFB — Configurer Pingdom ou un outil de surveillance sur mesure

  10. Tester avec curl — Vérifier les améliorations

Conclusion

Le TTFB est un indicateur crucial tant pour le SEO que pour la visibilité auprès des intelligences artificielles. Un TTFB lent entraîne moins de pages explorées, une priorité d'indexation réduite et, potentiellement, des données incomplètes pour les systèmes d'IA. La plupart des sites peuvent améliorer leur TTFB grâce à la mise en cache (côté serveur et page entière), à l'optimisation des bases de données et à l'utilisation d'un CDN.

Commencez par mesurer votre TTFB actuel, identifiez le plus grand goulot d'étranglement (généralement le traitement du serveur) et mettez en œuvre la mise en cache. Pour la majorité des sites, il est possible de descendre sous la barre des 600 ms avec une optimisation de base, et sous les 300 ms avec un CDN et une mise en cache agressive.

Rappelez-vous : le TTFB est le fondement — toutes les autres mesures de performance en dépendent. Optimisez d'abord le TTFB, puis le FCP et le LCP.