Performances PHP : comment profiler et accélérer le code 10 fois

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Votre site PHP ralentit ? Il est temps de regarder sous le capot

\n\n

Avez-vous déjà attendu le chargement d'une page plus longtemps que vous ne buvez votre café du matin ? Une douleur familière. PHP est un langage puissant, mais sans une configuration appropriée, il peut se transformer en tortue. Dans cet article, nous n'allons pas faire de cours ennuyeux. Nous allons prendre du code réel, le profiler, trouver les goulots d'étranglement et l'accélérer pour que votre serveur vous remercie.

\n\n

Parlons des performances PHP — des mesures simples au profilage approfondi. Vous apprendrez comment utiliser Xdebug et Blackfire pour trouver les zones problématiques, et quelles méthodes d'optimisation fonctionnent vraiment. C'est parti !

\n\n

Étape 1. Mesurons tout : des microsecondes aux mégaoctets

\n\n

Avant d'optimiser quoi que ce soit, il faut comprendre ce qui ralentit. L'intuition est souvent trompeuse. Utilisons des outils.

\n\n

La méthode la plus simple : microtime(true)

\n\n

Pour une vérification rapide d'un morceau de code, le bon vieux microtime() fera l'affaire. Pas élégant, mais ça marche.

\n\n
<?php\n$start = microtime(true);\n\n// Votre code lent\n$data = [];\nfor ($i = 0; $i < 100000; $i++) {\n    $data[] = md5($i . 'salt');\n}\n\n$end = microtime(true);\necho 'Temps d\'exécution : ' . round(($end - $start) * 1000, 2) . ' ms';\n?>
\n\n

Cette méthode est bonne pour une estimation grossière. Mais lorsque le projet prend de l'ampleur, des outils sérieux sont nécessaires.

\n\n

Xdebug — votre détective personnel

\n\n

Xdebug est la norme de facto pour le profilage PHP. Il génère des fichiers cachegrind que vous pouvez ouvrir dans KCachegrind (Linux) ou QCachegrind (Mac/Windows).

\n\n

Installation via pecl :

\n
pecl install xdebug
\n\n

Activons le profilage dans php.ini :

\n
xdebug.mode = profile\nxdebug.output_dir = /tmp/profiling
\n\n

Après l'exécution du script, un fichier apparaîtra dans le dossier. Ouvrez-le dans QCachegrind — vous verrez quelle fonction a consommé le plus de temps. Souvent, la surprise : ce n'est pas la base de données, mais un simple traitement de chaînes dans une boucle.

\n\n

Blackfire — pour ceux qui aiment les beaux tableaux de bord

\n\n

Blackfire de SensioLabs (les créateurs de Symfony) est un profileur cloud. Il montre non seulement le temps, mais aussi le nombre d'appels, la mémoire, les E/S. Il s'intègre avec PHPUnit, Symfony, Laravel.

\n\n

Exemple d'utilisation en ligne de commande :

\n
blackfire run php myscript.php
\n\n

Vous obtiendrez un lien vers un rapport web avec visualisation. Pratique pour trouver les goulots d'étranglement des performances PHP.

\n\n

Étape 2. Problèmes typiques et leurs solutions

\n\n

Maintenant que nous savons profiler, examinons les pièges courants.

\n\n

Problème 1 : Requêtes N+1 dans une boucle

\n\n

Un classique. Vous récupérez une liste d'utilisateurs, puis dans une boucle, vous faites une requête à la base de données pour chacun.

\n\n

Code lent :

\n
<?php\n$users = $db->query('SELECT id FROM users LIMIT 100');\nforeach ($users as $user) {\n    $orders = $db->query("SELECT * FROM orders WHERE user_id = {$user['id']}");\n    // ...\n}\n?>
\n\n

Optimisation :

\n
<?php\n$users = $db->query('SELECT id FROM users LIMIT 100');\n$ids = array_column($users, 'id');\n$orders = $db->query('SELECT * FROM orders WHERE user_id IN (' . implode(',', $ids) . ')');\n// Regroupement par user_id\n$grouped = [];\nforeach ($orders as $order) {\n    $grouped[$order['user_id']][] = $order;\n}\n?>
\n\n

Résultat : 100 requêtes sont devenues 2. Les performances de l'application PHP augmentent considérablement.

\n\n

Problème 2 : Boucles inefficaces et manipulation de chaînes

\n\n

La concaténation de chaînes dans une boucle est un mal. Utilisez des tableaux et implode().

\n\n
<?php\n// Mauvais\n$result = '';\nfor ($i = 0; $i < 10000; $i++) {\n    $result .= 'item' . $i . ',';\n}\n\n// Bon\n$parts = [];\nfor ($i =                

Blogs

Book Recommendations