52 votes

Serialize ou json en PHP ?

J'ai donc besoin d'encoder un tableau en PHP et de le stocker en texte brut dans une base de données MySQL. Ma question est de savoir si je dois utiliser serialize() ou json_encode() ? Quels sont les avantages et les inconvénients de chacun d'eux ?

Je pense que l'un ou l'autre ferait l'affaire dans cette situation. Mais lequel préférez-vous et pourquoi ? Si c'est pour quelque chose d'autre qu'un tableau ?

55voto

Pascal MARTIN Points 195780

Principal avantage de serialize il est spécifique à PHP, ce qui signifie que il peut représenter les types de PHP Vous récupérerez vos objets, toujours des instances de vos classes, lorsque vous désérialiserez vos données.

Principal avantage de json_encode : JSON n'est pas spécifique à PHP : il existe des bibliothèques pour le lire/écrire dans plusieurs langages - ce qui signifie qu'il est préférable si vous voulez quelque chose qui peut être manipulé avec un autre langage que PHP.

Une chaîne JSON est également plus facile à lire/écrire/modifier. à la main qu'une version sérialisée.

D'un autre côté, comme JSON n'est pas spécifique à PHP, il n'est pas conscient des choses qui sont spécifiques à PHP -- comme les types de données.

Quelques précisions :

  • Même s'il y a une petite différence de vitesse entre ces deux-là, cela ne devrait pas avoir beaucoup d'importance : vous ne sérialiserez/dé-sérialiserez probablement pas beaucoup de données.
  • Êtes-vous sûr que c'est la meilleure façon de stocker des données dans une base de données ?
    • Vous ne pourrez pas faire beaucoup de requêtes sur des chaînes sérialisées, dans une base de données : vous ne pourrez pas utiliser vos données dans des bases de données. where ni de le mettre à jour sans l'intervention de PHP...

13voto

Shozab Hasan Points 116

J'ai fait quelques analyses sur l'encodage Json et la sérialisation en PHP. Et j'ai trouvé que Json est le meilleur pour les données simples comme les tableaux.

Voir les résultats de mes expériences à http://blog.shozab.net/php-serialization-vs-json-encoding-for-an-array/

8voto

user359650 Points 2517

Un autre avantage de json_encode sur serialize est la taille. J'ai remarqué que lorsque j'essayais de comprendre pourquoi notre memcache La mémoire utilisée devenait si grande, et j'essayais de trouver des moyens de la réduire :

<?php

$myarray = array();
$myarray["a"]="b";
$serialize=serialize($myarray);
$json=json_encode($myarray);
$serialize_size=strlen($serialize);
$json_size=strlen($json);
var_dump($serialize);
var_dump($json);
echo "Size of serialized array: $serialize_size\n";
echo "Size of json encoded array: $json_size\n";
echo "Serialize is " . round(($serialize_size-$json_size)/$serialize_size*100) . "% bigger\n";

Ce qui vous donne :

string(22) "a:1:{s:1:"a";s:1:"b";}"
string(9) "{"a":"b"}"
Size of serialized array: 22
Size of json encoded array: 9
Serialize is 59% bigger

Bien entendu, j'ai pris l'exemple le plus extrême, car plus le tableau est court, plus le surcoût lié à la sérialisation est important. Pourtant, sur un site web de production, je vois des tableaux sérialisés qui sont 20% plus grands que leur équivalent json.

5voto

cletus Points 276888

Tout d'abord, la sérialisation d'un tableau ou d'un objet et son stockage dans une base de données est généralement un problème de code. Parfois, les gens finissent par mettre une liste séparée par des virgules dans une colonne et ont ensuite toutes sortes de problèmes lorsqu'ils découvrent plus tard qu'ils ont besoin d'effectuer une requête sur cette liste.

Réfléchissez-y bien si vous êtes dans ce genre de situation.

Quant aux différences. PHP serialize est probablement plus compact mais utilisable uniquement avec PHP. JSON est multiplateforme et peut-être plus lent à encoder et à décoder (bien que je doute que cela soit significatif).

3voto

Vidda Points 21

Tout d'abord, merci à Shozab Hasan et user359650 pour ces tests. Je me demandais quel choix était le meilleur et maintenant je le sais :

Pour encoder un simple tableau, JSON qui est OK à la fois avec PHP et javascript, peut-être d'autres langages.

Pour encoder un objet PHP, serialize est un meilleur choix en raison de la spécificité des objets PHP qui ne sont instanciables qu'avec PHP.

Pour stocker les données, il faut soit stocker les données encodées dans un fichier, soit utiliser MySQL avec le format standard. Il serait beaucoup plus facile de récupérer vos données. MySQL dispose d'excellentes fonctions pour récupérer les données de la manière dont vous le souhaitez, sans avoir recours à PHP.

Je n'ai jamais fait de test mais je pense que le stockage de fichiers est la meilleure façon de stocker vos données si le tri des fichiers du système est suffisant pour récupérer vos fichiers dans l'ordre alphabétique/numéral. MySQL est trop gourmand pour ce genre de traitement et utilise aussi le système de fichiers...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X