Pourquoi WordPress choisit-il la sérialisation des données plutôt que json_encode?

12

À mon petit âge avec WordPress, j’ai vu WordPress lui-même et ses plugins conviviaux utilisent PHP serialize() pour stocker des données dans la base de données dans de nombreux cas. Mais lors d’une recherche récente, j’ai trouvé un soutien sérieux de la part de la communauté pour json_encode() par rapport à serialize() .

Et j’ai personnellement testé un tableau associatif avec eux, ce qui indique:

  • serialize() stocke 342 caractères
  • json_encode() stocke 285 caractères

Pourquoi je pose cette question?

Je suis sur un projet alors que je vais stocker des méta-champs répétés dans un post. Où:

  • Les données seraient essentiellement en anglais, mais peuvent parfois être en bengali
  • Les données seraient un tableau associatif, 3 niveaux de profondeur (j'espère comprendre correctement les niveaux ):
array(
    1 => array(
        'key'=>'value',
        'key2'=>'value'
    ),
    2 => array(
        'key'=>'value',
        'key2'=>'value'
    )
)

J'ai vérifié le champ postmeta de la table meta_value c'est un longtext , cela signifie une longueur de 4 294 967 295 caractères (4 Go).

Il me faut donc une solution robuste pour stocker les objets.

    
posée Mayeenul Islam 07.04.2015 - 17:33

3 réponses

13

Je pense que je ne suis pas sûr à 100% que ce soit la vraie raison pour laquelle les développeurs de WP ont adopté cette approche, mais le bon sens me dit que la sérialisation préserve les types de variable et comporte une mini-fonction de détection d'erreur intégrée, et Json stocke uniquement les valeurs de chaîne { key : value } , donc quand vous retournerez en PHP, vous devrez deviner le format ou en créer un analyseur. Cela vous obligera à utiliser deux méthodes différentes pour gérer vos données: précédente, pour stocker les données au format json et après le décodage du json, il reviendra sous la forme d'un objet totalement différent.

C’est la principale raison de la différence de taille, PHP ne stocke pas seulement un tableau; il stocke combien d'éléments étaient dans le tableau quand il a été sérialisé, leurs types et leurs valeurs.

Vous ne stockez pas uniquement des paires clé-valeur dans la base de données, mais vous pouvez également stocker un objet avec différents types de variables.

    
réponse donnée Ramy Deeb 07.04.2015 - 17:57
6

Le codage JSON a été introduit dans PHP 5.2, WordPress est bien plus ancien et il est né (et conçu pour) PHP 4.

La sérialisation des données est une chose omniprésente dans WordPress. Par conséquent, passer de la sérialisation PHP à l'encodage JSON constituerait un énorme problème de compatibilité, et si je connais un peu WordPress, cela ne se produira jamais.

Cela dit, si vous pensez que l'encodage JSON est meilleur pour vous que la sérialisation PHP, utilisez-le.

Si vous transmettez une chaîne (c'est-à-dire la version codée JSON de vos données) pour poster des méta-fonctions, WordPress ne la touchera pas, mais vous devrez alors vous rappeler de décoder les données JSON lors de l'extraction.

Si la taille de stockage de la base de données est très importante pour vous, cela vaut probablement la peine de travailler davantage, sinon laissez simplement WordPress utiliser ce qu'il utilise sans vous en soucier.

Peut-être pouvez-vous évaluer s'il s'agit de tables personnalisées pour enregistrer vos données.

    
réponse donnée gmazzap 07.04.2015 - 18:04
3

Je suis tenté de clore ceci comme "sujet à opinion" mais je pense qu’il existe quelques bonnes réponses à cette question. Je vais aller avec "l'histoire".

1) json_encode est relativement nouveau dans le coeur de PHP.

  

json_encode

     

(PHP 5> 5.2.0, PECL json> 1.2.0) json_encode - Renvoie le code JSON.   représentation d'une valeur

     

enlace

json_encode n'aurait pas été fiable au début de WordPress. Il n’a été intégré que dans PHP "noyau" en 5.2, bien qu’il soit disponible bien avant comme extension PECL.

Deuxièmement, si vous introduisez un objet tel que WP_Query dans json_encode , vous obtenez un objet stdClass sur json_decode . serialize / unserialize préservera l'objet.

    
réponse donnée s_ha_dum 07.04.2015 - 18:00

Lire d'autres questions sur les étiquettes