Introduction
\nUne application PHP lente, ce ne sont pas seulement des secondes d'attente perdues, mais aussi des utilisateurs frustrés, une baisse de classement dans les résultats de recherche et une charge accrue sur le serveur. Heureusement, même un développeur débutant peut considérablement améliorer les performances de son code sans avoir à se plonger dans des configurations système complexes. Dans cet article, nous allons aborder des méthodes de base mais efficaces pour optimiser les applications PHP, qui aideront votre site ou service web à fonctionner plus rapidement et plus stablement.
\nNous examinerons quatre axes clés : la mise en cache des données, l'optimisation du travail avec les bases de données, une gestion judicieuse de la mémoire et l'utilisation des fonctionnalités modernes de PHP. Chaque section sera accompagnée d'exemples de code pratiques.
\n\nLa mise en cache : votre principal outil d'accélération
\nLa mise en cache consiste à enregistrer les résultats d'opérations coûteuses pour les réutiliser. Au lieu de générer la page à chaque fois ou d'exécuter une requête SQL complexe, vous fournissez une copie préenregistrée.
\n\nMise en cache en mémoire avec Memcached ou Redis
\nLe moyen le plus rapide de mettre en cache est d'utiliser des stockages en mémoire, comme Memcached ou Redis. Ils stockent les données dans la RAM, ce qui permet de les récupérer en quelques microsecondes.
Exemple de mise en cache simple du résultat d'une requête de base de données avec Memcached :
<?php\n$memcached = new Memcached();\n$memcached->addServer('localhost', 11211);\n\n$cacheKey = 'user_profile_123';\n$userData = $memcached->get($cacheKey);\n\nif ($userData === false) {\n // Les données ne sont pas dans le cache — on exécute la requête lourde\n $userData = getUserFromDatabase(123);\n // On sauvegarde dans le cache pour 10 minutes (600 secondes)\n $memcached->set($cacheKey, $userData, 600);\n}\n\necho $userData['name'];\n?>\n\nMise en cache de pages HTML entières
\nPour les pages statiques ou rarement modifiées, vous pouvez mettre en cache le rendu HTML complet. Cela réduit la charge sur l'interpréteur PHP et le serveur web.
\n<?php\n$cacheFile = 'cache/index.html';\n$cacheTime = 3600; // 1 heure\n\nif (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $cacheTime) {\n // On sert la page mise en cache\n readfile($cacheFile);\n exit;\n}\n\n// On démarre la mise en tampon de sortie\nob_start();\n\n// ... votre code PHP habituel qui génère la page ...\n\n$html = ob_get_clean();\nfile_put_contents($cacheFile, $html);\necho $html;\n?>\n\nOptimisation du travail avec les bases de données
\nLa base de données est le goulot d'étranglement le plus courant dans la plupart des applications PHP. Quelques modifications simples peuvent apporter un gain de vitesse considérable.
\n\nUtilisez les index
\nSans index, MySQL effectue un balayage complet de la table (full table scan), ce qui est extrêmement lent sur de grands volumes de données. Ajoutez des index sur les champs utilisés dans les conditions WHERE, JOIN et ORDER BY.
-- Exemple : table des commandes\nCREATE INDEX idx_user_id ON orders(user_id);\nCREATE INDEX idx_created_at ON orders(created_at);\n\nÉvitez les requêtes N+1
\nC'est une erreur classique : dans une boucle, vous effectuez une requête à la base de données pour chaque élément. Utilisez plutôt une seule requête avec JOIN ou une sous-requête.
Mauvais exemple (N+1) :
\n<?php\n$users = $db->query("SELECT * FROM users");\nforeach ($users as $user) {\n // Pour chaque utilisateur, une requête séparée est effectuée\n $orders = $db->query("SELECT * FROM orders WHERE user_id = " . $user['id']);\n}\n?>\n\nBon exemple (une seule requête) :
\n<?php\n$usersWithOrders = $db->query("\n SELECT u.*, o.* \n FROM users u \n LEFT JOIN orders o ON u.id = o.user_id\n");\n?>\n\nLimitez la sélection des données
\nNe demandez jamais toutes les lignes si vous n'en avez besoin que de 10. Utilisez