Introduction : Pourquoi la vitesse est-elle importante ?
Imaginez que votre site mette plus de 3 secondes à charger. Selon Google, 53 % des utilisateurs le quitteront et le taux de conversion chutera de 20 %. Pour un développeur PHP, savoir optimiser une application n'est pas simplement une « bonne pratique », mais une nécessité. Même si vous débutez, les techniques de base pour accélérer le code vous aideront à créer des projets rapides et réactifs.
Dans cet article, nous aborderons 4 axes clés : de la mise en cache et du travail avec les bases de données à la configuration du serveur et au profilage. Vous obtiendrez des exemples de code prêts à l'emploi et une liste de contrôle pour la mise en œuvre.
1. Mise en cache : conserver le résultat, ne pas le recalculer
La mise en cache, c'est comme écrire une antisèche avant un examen. Au lieu de recalculer des données complexes à chaque fois, on les stocke dans un stockage rapide.
1.1. Mise en cache en mémoire (Memcached / Redis)
Pour les données qui changent rarement (par exemple, une liste de catégories ou des paramètres), la mise en cache en mémoire vive est idéale.
<?php// Exemple avec Memcached$memcached = new Memcached();$memcached->addServer('localhost', 11211);
$key = 'categories_list';$categories = $memcached->get($key);
if ($categories === false) { // Les données ne sont pas dans le cache — on les récupère depuis la BDD $categories = $db->query("SELECT * FROM categories")->fetchAll(); // On les conserve pendant 1 heure (3600 secondes) $memcached->set($key, $categories, 3600);}
// On utilise $categoriesforeach ($categories as $cat) { echo $cat['name'];}?>1.2. Mise en cache de fragments HTML (Output Buffer)
Si vous avez des blocs lourds (widgets, menus), mettez en cache le HTML généré.
<?phpfunction getCachedWidget($widgetName, $ttl = 300) { $cacheFile = __DIR__ . '/cache/' . md5($widgetName) . '.html'; if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $ttl) { return file_get_contents($cacheFile); } ob_start(); // Code qui génère le widget ici echo "<div class='widget'>Contenu complexe...</div>"; $html = ob_get_clean(); file_put_contents($cacheFile, $html); return $html;}
echo getCachedWidget('sidebar_menu');?>2. Optimisation des requêtes à la base de données
Le goulot d'étranglement le plus fréquent dans les applications PHP est la base de données. Une seule mauvaise requête peut « tuer » les performances de tout le site.
2.1. Utilisez des index
Sans index, MySQL est obligé de scanner toute la table. Ajoutez des index sur les champs utilisés dans WHERE, JOIN et ORDER BY.
-- Mauvais : scan completSELECT * FROM users WHERE email = 'test@test.com';
-- Bon : utilisation d'un indexCREATE INDEX idx_email ON users(email);SELECT * FROM users WHERE email = 'test@test.com';2.2. Évitez les requêtes N+1
C'est une erreur classique : dans une boucle, vous interrogez la BDD pour chaque élément.
<?php// MAUVAIS : requêtes N+1$users = $db->query("SELECT * FROM users")->fetchAll();foreach ($users as $user) { $orders = $db->query("SELECT * FROM orders WHERE user_id = " . $user['id']); // ...}
// BON : une seule requête avec JOIN$users = $db->query(" SELECT u.*, o.* FROM users u LEFT JOIN orders o ON u.id = o.user_id")->fetchAll();?>2.3. Chargement paresseux (Lazy Loading)
Ne chargez pas les données dont vous n'avez pas besoin immédiatement. Utilisez la pagination ou LIMIT.
// Au lieu de :$all = $db->query("SELECT * FROM logs"); // 100 000 lignes
// Utilisez :$page = $_GET['page'] ?? 1;$limit = 20;$offset = ($page - 1) * $limit;$logs = $db->query("SELECT * FROM logs LIMIT $limit OFFSET $offset");3. Configuration du serveur et d'OPcache
Parfois, le problème ne vient pas du code, mais de la configuration de PHP. L'optimisation la plus puissante est