En mi corta edad con WordPress, he visto que WordPress mismo y sus complementos amigables están utilizando PHP serialize()
para almacenar datos en db en muchos casos. Pero en una búsqueda reciente encontré un serio apoyo de la comunidad para json_encode()
el serialize()
.
- Una prueba que prueba
json_encode()
es mejor queserialize()
- StackOverflow - Razones por las que
json_encode()
se pueden usar y por qué no - StackOverflow
Y personalmente probé una matriz asociativa con ambos, que muestra:
serialize()
almacena 342 caracteresjson_encode()
almacena 285 caracteres
¿Por qué estoy preguntando esto?
Estoy en un proyecto mientras voy a almacenar metacampos repetidos en una publicación. Dónde:
- Los datos estarían básicamente en inglés, pero a veces pueden ser bengalíes
- Los datos serían una matriz asociativa, de 3 niveles de profundidad (espero haber entendido los niveles correctamente):
array(
1 => array(
'key'=>'value',
'key2'=>'value'
),
2 => array(
'key'=>'value',
'key2'=>'value'
)
)
He comprobado que el campo de la postmeta
tabla es meta_value
un longtext
, eso significa una longitud de 4,294,967,295 caracteres (4GB).
Así que necesito una solución robusta para almacenar cosas.
Respuestas:
Creo que no estoy 100% seguro de que esta sea la verdadera razón por la que los desarrolladores de WP adoptaron este enfoque, pero el sentido común me dice que serializar conserva los tipos de variables y tiene una mini detección de errores incorporada, y json almacena solo valores de cadena
{ key : value }
, así que cuando Regrese a PHP, tendrá que adivinar el formato o hacer un analizador para él. Esto lo obligará a tener dos formas diferentes de manejar sus datos: anterior, para almacenar los datos como json y después de decodificar el json, volverá como un objeto totalmente diferente.Esta es la razón principal de la diferencia de tamaño, PHP está almacenando no solo una matriz; está almacenando cuántos elementos había en la matriz cuando se serializó, sus tipos y sus valores.
No está almacenando solo pares de valores clave en la base de datos, sino que también puede estar almacenando un objeto con diferentes tipos de variables.
fuente
La codificación JSON se introdujo en PHP 5.2, WordPress es mucho más antiguo y nació (y está diseñado para) PHP 4.
La serialización de datos es algo generalizado en WordPress, por lo que pasar de la serialización PHP a la codificación JSON significaría un gran problema de compatibilidad con versiones anteriores, y si conozco un poco a WordPress, eso nunca sucederá.
Dicho esto, si crees que la codificación JSON es mejor para ti que la serialización PHP, simplemente úsala.
Si pasa una cadena (es decir, la versión codificada de JSON de sus datos) para publicar metafunciones, WordPress no la tocará, pero debe recordar decodificar los datos JSON al recuperarlos.
Si el tamaño de almacenamiento de la base de datos es muy importante para usted, probablemente valga la pena el trabajo adicional, de lo contrario, simplemente deje que WordPress use lo que usa y no se preocupe.
Tal vez, puede evaluar si es el caso de tablas personalizadas para guardar sus datos.
fuente
Estoy tentado a cerrar esto como "sujeto a opinión", pero creo que hay un par de buenas respuestas a la pregunta. Voy a ir con "historia".
1)
json_encode
es relativamente nuevo en el núcleo de PHP.json_encode
no habría sido confiable en los primeros días de WordPress. Solo se incluyó en PHP "núcleo" en 5.2, aunque estaba disponible como una extensión PECL mucho antes.En segundo lugar, si alimenta un objeto como un
WP_Query
objetojson_encode
, obtiene unstdClass
objetojson_decode
.serialize
/unserialize
preservará el objeto.fuente