JSON ou serialize : l'éternelle question du développeur PHP
\n\nImaginez : vous écrivez un script PHP qui doit sauvegarder un tableau complexe avec les paramètres d'un utilisateur. Deux options vous viennent immédiatement à l'esprit : json_encode() et serialize(). Laquelle choisir ? Cette question tourmente des milliers de développeurs sur Stack Overflow, et aujourd'hui nous allons une fois pour toutes déterminer quelle méthode est vraiment la meilleure.
Je vais vous montrer non seulement des comparaisons sèches, mais aussi des exemples de code réels, des tests de performance et les pièges cachés dont les documentations ne parlent pas. C'est parti !
\n\nQu'ont en commun json_encode et serialize ?
\n\nLes deux fonctions transforment des structures de données complexes (tableaux, objets) en une chaîne de caractères qui peut être sauvegardée dans un fichier, une base de données ou un cache. Mais elles le font différemment.
\n\n- \n
- json_encode — convertit les données au format JSON standard (texte compréhensible par JavaScript et la plupart des langages). \n
- serialize — crée un format PHP interne qui contient des informations sur les types de données et peut restaurer des objets en conservant les classes. \n
Exemple de code simple
\n\n<?php\n$array = [\n 'name' => 'Иван',\n 'age' => 30,\n 'skills' => ['PHP', 'JavaScript', 'Python']\n];\n\n// JSON\n$json = json_encode($array, JSON_UNESCAPED_UNICODE);\necho $json; // {"name":"Иван","age":30,"skills":["PHP","JavaScript","Python"]}\n\n// Serialize\n$serialized = serialize($array);\necho $serialized; // a:3:{s:4:"name";s:8:"Иван";s:3:"age";i:30;s:6:"skills";a:3:{i:0;s:3:"PHP";i:1;s:10:"JavaScript";i:2;s:6:"Python";}}\n?>\n\nLa différence est immédiatement visible : JSON est plus compact et lisible, tandis que serialize est plus verbeux mais contient plus de métadonnées.
\n\nComparaison selon des critères clés
\n\nDétaillons tout cela. J'ai effectué des tests et rassemblé des données qui vous aideront à prendre une décision.
\n\n1. Performances : qui est le plus rapide ?
\n\nBeaucoup pensent que serialize est plus rapide car c'est un format PHP "natif". Mais la réalité est plus complexe.
\n\n<?php\n$largeArray = [];\nfor ($i = 0; $i < 10000; $i++) {\n $largeArray[] = [\n 'id' => $i,\n 'name' => 'User_' . $i,\n 'data' => range(1, 50)\n ];\n}\n\n// Test json_encode\n$start = microtime(true);\n$json = json_encode($largeArray);\n$jsonTime = microtime(true) - $start;\n\n// Test serialize\n$start = microtime(true);\n$serialized = serialize($largeArray); \n$serializeTime = microtime(true) - $start;\n\necho "JSON : {$jsonTime} sec\\n";\necho "Serialize : {$serializeTime} sec\\n";\n// Résultat : JSON est souvent 10 à 30 % plus rapide\n?>\n\nConclusion : json_encode est généralement plus rapide, surtout sur les grands tableaux. La raison est que JSON utilise un algorithme plus simple sans conserver les informations sur les classes.
2. Taille des données : qui est le plus compact ?
\n\nJSON gagne presque toujours en taille. Comparez vous-même :
\n\n- \n
- JSON :
{"name":"Иван","age":30}— 26 octets \n - Serialize :
a:2:{s:4:"name";s:8:"Иван";s:3:"age";i:30;}— 41 octets \n
La différence est de 1,5 à 2 fois en faveur de JSON. Si vous stockez des gigaoctets de données dans le cache, c'est crucial.
\n\n3. Sécurité : la menace cachée de serialize
\n\nC'est là que beaucoup se font piéger. unserialize() peut exécuter du code arbitraire si on lui transmet des données falsifiées. C'est ce qu'on appelle une injection d'objets PHP.
<?php\n// Exemple dangereux\n$userInput = $_GET['data']; // L'utilisateur peut transmettre une chaîne malveillante\n$object = unserialize($userInput); // Risque ! Peut créer un objet avec du code dangereux\n\n// Alternative sécurisée\n$jsonData = json_decode($userInput, true); // Simple tableau, aucun objet\n?>\n\nImportant : N'utilisez jamais unserialize() avec des données provenant de l'utilisateur. JSON est absolument sûr à cet égard.