Mise en cache en PHP : comment accélérer votre site et réduire la charge serveur

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

Mise en cache des données en PHP : premiers secours pour votre serveur

\n\n

Imaginez : vous visitez votre site préféré, et il met une éternité à charger. Cela vous dit quelque chose ? Le plus souvent, la cause n'est ni un hébergement faible ni un design « lourd », mais le fait que le serveur effectue le même travail à chaque fois. Il interroge à nouveau la base de données, reconstruit le code HTML, recalcule les statistiques.

\n\n

La solution à ce problème est la mise en cache en PHP. C'est comme préparer le déjeuner pour une semaine à l'avance : on passe du temps une fois, puis on réchauffe simplement. Dans le monde du développement web, cela s'appelle la « mise en cache des données ». Un cache PHP bien configuré peut accélérer un site de 10 à 50 fois et réduire la charge du serveur au minimum.

\n\n

Dans cet article, nous allons examiner les types de mise en cache qui existent, comment les implémenter avec PHP et quel outil choisir selon le cas. C'est parti !

\n\n

Pourquoi la mise en cache est un must pour tout projet PHP ?

\n\n

Tout site dynamique en PHP fonctionne selon le schéma : requête → traitement → réponse. L'opération la plus coûteuse est le travail avec la base de données (MySQL, PostgreSQL) et la génération de pages HTML complexes. Si vous avez 1000 visiteurs par heure et que chaque requête effectue 10 requêtes SQL, le serveur va vite « s'écrouler ».

\n\n

Le cache en PHP résout trois problèmes principaux :

\n\n
    \n
  • Vitesse — les données sont fournies depuis la mémoire ou un fichier en quelques millisecondes ;
  • \n
  • Économie de ressources — le processeur et la base de données se reposent ;
  • \n
  • Scalabilité — le site supporte une augmentation du trafic sans mise à niveau du matériel.
  • \n
\n\n

Peu importe que vous écriviez en PHP pur ou que vous utilisiez un framework (Laravel, Symfony, Yii2) — les principes de mise en cache des données sont les mêmes partout.

\n\n

Principaux types de mise en cache en PHP

\n\n

Avant d'écrire du code, voyons ce que nous pouvons exactement mettre en cache. On distingue trois niveaux principaux :

\n\n

1. Cache de pages (Page Cache)

\n

Le type le plus simple et le plus efficace. Le code HTML prêt d'une page est sauvegardé dans un fichier ou en mémoire. Lors d'une requête ultérieure, le serveur renvoie le HTML prêt, en contournant l'interpréteur PHP et la base de données. Idéal pour les pages statiques (accueil, blog, catalogue).

\n\n

2. Cache de données et d'objets (Data/Object Cache)

\n

Les résultats de calculs lourds, de requêtes en base de données, de réponses API sont sauvegardés. Par exemple, la liste des derniers articles, le taux de change, le classement des utilisateurs. C'est ce qu'on appelle communément la mise en cache des données.

\n\n

3. Cache de code (Opcode Cache)

\n

Les scripts PHP sont compilés en bytecode. Des outils comme OPcache sauvegardent ce bytecode en mémoire pour ne pas compiler le même script à chaque requête. Il s'active au niveau du serveur et ne nécessite pas d'écriture de code.

\n\n

Dans cet article, nous nous concentrerons sur les deux premiers types, car ils peuvent être contrôlés via le code PHP.

\n\n

Implémentation de la mise en cache en PHP : du simple au complexe

\n\n

Cache fichier fait maison

\n

La méthode la plus simple de mise en cache en PHP est de sauvegarder les données dans des fichiers. Cela ne nécessite pas d'installer d'extensions supplémentaires et fonctionne sur n'importe quel hébergement.

\n\n

Voici un exemple de classe simple pour un cache fichier :

\n\n
<?php\nclass FileCache\n{\n    private $cacheDir;\n\n    public function __construct($cacheDir = '/tmp/php-cache/')\n    {\n        $this->cacheDir = $cacheDir;\n        if (!is_dir($this->cacheDir)) {\n            mkdir($this->cacheDir, 0755, true);\n        }\n    }\n\n    public function set($key, $data, $ttl = 3600)\n    {\n        $file = $this->getFilePath($key);\n        $content = [\n            'expires' => time() + $ttl,\n            'data' => $data\n        ];\n        file_put_contents($file, serialize($content));\n    }\n\n    public function get($key)\n    {\n        $file = $this->getFilePath($key);\n        if (!file_exists($file)) {\n            return null;\n        }\n        $content = unserialize(file_get_contents($file));\n        if ($content['expires'] < time(                

Blogs

Book Recommendations