web-dev-qa-db-fra.com

Sérialiser ou json en PHP?

Je dois donc encoder un tableau en PHP et le stocker en texte brut dans la 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 autre chose qu'un tableau?

45
datasn.io

Principal avantage de serialize: il est spécifique à PHP, ce qui signifie il peut représenter PHP, y compris les instances de vos propres classes - et vous ' ll récupérera vos objets, toujours des instances de vos classes, lors de la désérialisation de vos données.


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

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

D'un autre côté, comme JSON n'est pas spécifique à PHP, il ne connaît pas les éléments spécifiques à PHP - comme les types de données.


En quelques sidenotes:

  • Même s'il y a une petite différence de vitesse entre ces deux, cela ne devrait pas avoir beaucoup d'importance: vous ne sérialiserez/ne désérialiserez probablement pas beaucoup de données
  • Êtes-vous sûr que c'est le meilleur moyen de stocker des données dans une base de données?
    • Vous ne pourrez pas faire beaucoup de requêtes sur des strins sérialisés, dans une base de données: vous ne pourrez pas utiliser vos données dans les clauses where, ni les mettre à jour sans l'intervention de PHP ...
49
Pascal MARTIN

J'ai fait quelques analyses sur Json Encoding vs Serialization en PHP. Et j'ai trouvé que Json est le meilleur pour les données simples et simples comme les tableaux.

Voir les résultats de mes expériences sur https://www.shozab.com/php-serialization-vs-json-encoding-for-an-array/

11
Shozab Hasan

Un autre avantage de json_encode sur serialize est la taille. J'ai remarqué que pendant que j'essayais de comprendre pourquoi notre memcache mémoire utilisée devenait si grande, et j'essayais de trouver des moyens de 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

Évidemment, j'ai pris l'exemple le plus extrême, car plus le tableau est court, plus la surcharge avec sérialiser est importante (par rapport à la taille initiale de l'objet, en raison du formatage qui impose un nombre minimum de caractères, quelle que soit la taille du contenu). Toujours à partir d'un site Web de production, je vois une baie sérialisée qui est 20% plus grande que son équivalent json.

6
Max

Eh bien tout d'abord sérialiser un tableau ou un objet et le stocker dans une base de données est généralement une odeur de code. Parfois, les gens finissent par mettre une liste séparée par des virgules dans une colonne, puis se retrouvent dans toutes sortes de problèmes lorsqu'ils découvrent plus tard qu'ils doivent l'interroger.

Alors réfléchissez bien à cela si c'est 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 sérieusement).

5
cletus

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

Pour encoder un tableau simple, JSON qui est OK avec les deux PHP ET javascript, peut-être d'autres langues.

Pour coder un objet PHP, la sérialisation est un meilleur choix en raison de la spécificité de PHP Objets instanciables uniquement avec PHP).

Pour stocker des données, stockez des données encodées dans un fichier ou utilisez MySQL au format standard. Il serait beaucoup plus facile de récupérer vos données. MySQL a de grandes fonctions pour obtenir des données comme vous le souhaitez sans traitement PHP.

Je n'ai jamais fait de test mais je pense que le stockage de fichiers est le meilleur moyen de stocker vos données si le tri des fichiers système est suffisant pour récupérer vos fichiers par ordre alphabétique/numérique. MySQL est trop gourmand pour ce genre de traitement et utilise aussi le système de fichiers ...

3
Vidda

Si vos données ne doivent jamais quitter votre application PHP, je recommande serialize () car elle offre de nombreuses fonctionnalités supplémentaires comme les méthodes __sleep () et __wakeup () pour vos objets. Elle restaure également objets comme instances des classes correctes.

Si vous transmettez les données sérialisées à une autre application, vous devez utiliser JSON ou XML pour la compatibilité.

Mais stocker un objet sérialisé dans une base de données? Vous devriez peut-être y réfléchir à nouveau. Cela peut être un vrai problème plus tard.

2
selfawaresoup