Introduction
PHP reste l'un des langages les plus populaires pour le développement web : WordPress, Laravel, Symfony et des millions de sites fonctionnent avec lui. Cependant, avec l'augmentation de la charge, les performances des applications PHP peuvent devenir un goulot d'étranglement. Un chargement lent des pages non seulement dégrade l'expérience utilisateur, mais réduit également le classement dans les résultats de recherche (Google prend en compte les Core Web Vitals).
Dans cet article, nous allons examiner les méthodes éprouvées d'optimisation PHP qui vous aideront à accélérer votre application sans réécrire complètement le code. Vous découvrirez la mise en cache, la configuration de l'interpréteur, l'optimisation de la base de données et le profilage.
1. Mise en cache : le premier pas vers la vitesse
La mise en cache est le moyen le plus efficace de réduire le temps de réponse. Au lieu d'exécuter des opérations lourdes à chaque fois, enregistrez le résultat et servez-le depuis le cache.
1.1. OpCache (PHP 7/8)
PHP est un langage interprété : à chaque requête, il compile le script en opcode (byte-code). OpCache stocke l'opcode compilé dans la mémoire vive, évitant ainsi une recompilation. Cela permet un gain de performances de 30 à 50 %.
Comment l'activer : Ouvrez php.ini et assurez-vous que les paramètres sont configurés :
opcache.enable=1opcache.memory_consumption=128opcache.max_accelerated_files=10000opcache.revalidate_freq=2Pour la production, définissez opcache.revalidate_freq=0 et videz le cache manuellement lors du déploiement.
1.2. Mise en cache des données (Redis / Memcached)
Si votre application effectue des requêtes coûteuses vers la base de données ou des API externes, utilisez des stockages en mémoire.
Exemple avec Redis :
<?php$redis = new Redis();$redis->connect('127.0.0.1', 6379);
$cacheKey = 'user_profile_' . $userId;$profile = $redis->get($cacheKey);
if (!$profile) { // Requête coûteuse à la base de données $profile = getUserProfileFromDB($userId); $redis->setex($cacheKey, 3600, serialize($profile)); // TTL 1 heure}
$profile = unserialize($profile);1.3. Mise en cache HTML (Full Page Cache)
Pour les pages statiques ou rarement mises à jour (blog, landing page), vous pouvez mettre en cache le rendu HTML complet. Dans Laravel, cela se fait via un middleware, dans Symfony via le cache HTTP.
2. Optimisation des requêtes SQL et de la base de données
Le plus souvent, le goulot d'étranglement d'une application PHP est la base de données. Les requêtes lentes consomment les ressources du serveur.
2.1. Utilisez des index
Assurez-vous que les colonnes utilisées dans les clauses WHERE, JOIN et ORDER BY sont indexées. Vous pouvez le vérifier avec EXPLAIN SELECT ....
Mauvaise requête (sans index) :
SELECT * FROM orders WHERE status = 'pending';Bonne requête (avec index) :
CREATE INDEX idx_orders_status ON orders (status);SELECT * FROM orders WHERE status = 'pending';2.2. Évitez les requêtes N+1
C'est une erreur classique des ORM : récupérer des données pour chaque enregistrement dans une boucle.
Problème (Laravel Eloquent) :
$users = User::all();foreach ($users as $user) { echo $user->profile->bio; // nouvelle requête à chaque fois}Solution (chargement eager) :
$users = User::with('profile')->get();foreach ($users as $user) { echo $user->profile->bio; // une seule requête}2.3. Pagination au lieu de LIMIT avec un grand décalage
Avec LIMIT 10 OFFSET 100000, MySQL parcourt quand même 100010 lignes. Utilisez la cursor-based pagination (recherche par index) :
SELECT * FROM posts WHERE id > $lastId ORDER BY id ASC LIMIT 10;3. Optimisation du code et de l'architecture
Même avec une base de données et un cache parfaits, un mauvais code p