Introduction : l'éternel dilemme du développeur PHP
\n\nChaque développeur PHP a été confronté au moins une fois à la question : "Comment sauvegarder un tableau dans un fichier, une base de données ou un cache ?". Sur Stack Overflow, la question "Preferred method to store PHP arrays (json_encode vs serialize)" a recueilli des milliers de vues et des dizaines de réponses. Et ce n'est pas surprenant, car le choix entre json_encode() et serialize() impacte les performances, la compatibilité et même la sécurité de votre code.
Dans cet article, nous analyserons les deux méthodes avec des exemples concrets, comparerons leurs forces et faiblesses, et donnerons des recommandations claires sur quand utiliser quoi. C'est parti !
\n\nQu'est-ce que la sérialisation en PHP ?
\n\nLa sérialisation est le processus de conversion d'une structure de données complexe (tableau, objet) en une chaîne de caractères pouvant être sauvegardée ou transmise. Le processus inverse s'appelle la désérialisation.
\n\nPHP propose deux outils principaux pour cette tâche :
\n\n- \n
serialize()/unserialize()— le mécanisme intégré de PHP. \n json_encode()/json_decode()— le travail avec le format JSON. \n
À première vue, les deux font la même chose. Mais le diable, comme toujours, se cache dans les détails.
\n\nExemple 1 : Tableau associatif simple
\n\nCommençons par le cas le plus simple — un tableau associatif avec les données d'un utilisateur :
\n\n<?php\n$user = [\n 'name' => 'Алексей',\n 'email' => 'alex@example.com',\n 'age' => 30,\n 'is_admin' => false\n];\n\n// Sérialisation\n$serialized = serialize($user);\necho $serialized . PHP_EOL;\n// Sortie : a:4:{s:4:"name";s:14:"Алексей";s:5:"email";s:17:"alex@example.com";s:3:"age";i:30;s:8:"is_admin";b:0;}\n\n// JSON\n$json = json_encode($user, JSON_UNESCAPED_UNICODE);\necho $json . PHP_EOL;\n// Sortie : {"name":"Алексей","email":"alex@example.com","age":30,"is_admin":false}\n?>\n\nDéjà à ce stade, la différence est visible : serialize() produit une chaîne plus "brouillonne" avec les types de données (s: — chaîne, i: — entier, b: — booléen). Le JSON, quant à lui, est propre et lisible.
Exemple 2 : Tableau multidimensionnel
\n\nComplexifions la tâche et sauvegardons un tableau avec des données imbriquées — par exemple, une liste d'articles dans un panier :
\n\n<?php\n$cart = [\n ['id' => 101, 'name' => 'Livre "PHP pour les pros"', 'price' => 1500, 'quantity' => 2],\n ['id' => 102, 'name' => 'Cours "Maître JSON"', 'price' => 3000, 'quantity' => 1],\n ['id' => 103, 'name' => 'Certificat', 'price' => 500, 'quantity' => 3]\n];\n\n// Comparons la taille des chaînes\n$serialized = serialize($cart);\n$json = json_encode($cart, JSON_UNESCAPED_UNICODE);\n\necho "Serialize : " . strlen($serialized) . " octets\\n";\necho "JSON : " . strlen($json) . " octets\\n";\n// Sortie (approximative) :\n// Serialize : 218 octets\n// JSON : 188 octets\n?>\n\nConclusion : Le JSON est généralement plus compact, surtout pour les grands tableaux. C'est crucial pour le stockage en base de données ou la transmission réseau.
\n\nPerformances : qu'est-ce qui est le plus rapide ?
\n\nLa vitesse est l'un des facteurs clés. Testons sur 10 000 itérations :
\n\n<?php\n$bigArray = [];\nfor ($i = 0; $i < 1000; $i++) {\n $bigArray[] = [\n 'id' => $i,\n 'name' => 'Élément #' . $i,\n 'data' => range(1, 10)\n ];\n}\n\n$start = microtime(true);\nfor ($i = 0; $i < 10000; $i++) {\n $s = serialize($bigArray);\n $us = unserialize($s);\n}\necho "Serialize : " . (microtime(true) - $start) . " sec\\n";\n\n$start = microtime(true);\nfor ($i = 0; $i < 10000; $i++) {\n $j = json_encode($bigArray);\n $uj = json_decode($j, true);\n}\necho "JSON : " . (microtime(true) - $start) . " sec\\n";\n?>\n\nRésultats (sur PHP 8.2) :
\n- \n
- Serialize : ~1,8 sec \n
- JSON : ~1,2 sec \n
Conclusion : json_encode() / json_decode() est généralement plus rapide que serialize() / unserialize(), surtout pour les grands tableaux. Cependant, la différence n'est pas toujours critique pour les petits volumes de données.
Sécurité : attention aux pièges
\n\nLa sécurité est un aspect important. unserialize() peut être dangereux si vous travaillez avec des données provenant de sources non fiables. Il peut exécuter du code arbitraire via l'injection d'objets. json_decode() est beaucoup plus sûr car il ne crée que des tableaux et des types scalaires.
Recommandation : Si vous travaillez avec des données utilisateur ou des données provenant de sources externes, utilisez toujours JSON. Réservez serialize() pour les données internes que vous contrôlez totalement.
Compatibilité : JSON gagne
\n\nLe JSON est un format universel pris en charge par tous les langages de programmation. serialize() est un format spécifique à PHP. Si vous prévoyez d'utiliser les données en dehors de PHP (par exemple, dans une application JavaScript ou mobile), le JSON est le seul choix correct.
Quand utiliser serialize ?
\n\nMalgré ses inconvénients, serialize() a ses avantages :
- \n
- Objets complexes :
serialize()peut sérialiser des objets avec leurs propriétés privées et protégées. JSON ne gère que les propriétés publiques. \n - Ressources :
serialize()peut gérer certains types de ressources (par exemple, les connexions à la base de données), bien que cela soit rarement utile. \n - Compatibilité ascendante : Les anciennes versions de PHP peuvent ne pas comprendre correctement les données JSON si vous utilisez des caractères spéciaux. \n
Conclusion : que choisir ?
\n\nRésumons :
\n| Critère | \nJSON | \nSerialize | \n
|---|---|---|
| Lisibilité | \nÉlevée | \nFaible | \n
| Taille | \nCompacte | \nPlus volumineuse | \n
| Vitesse | \nRapide | \nMoyenne | \n
| Sécurité | \nSûr | \nDangereux avec des données non fiables | \n
| Compatibilité | \nUniverselle | \nPHP uniquement | \n
| Objets | \nPubliques uniquement | \nToutes les propriétés | \n
Recommandation générale : Utilisez json_encode() / json_decode() dans 90 % des cas. C'est plus rapide, plus sûr et plus compatible. Réservez serialize() pour les cas où vous devez sauvegarder des objets complexes avec des propriétés privées, ou lorsque vous travaillez avec des données internes que vous contrôlez totalement.
Et n'oubliez pas : le meilleur code est celui qui est simple, compréhensible et sécurisé. Bonne programmation !