2010-04-04 44 views
42

Así que necesito codificar una matriz en PHP y almacenarla en texto plano en la base de datos MySQL, mi pregunta es si debo usar serialize() o json_encode()? ¿Cuáles son las ventajas y desventajas de cada uno de ellos?Serializar o json en PHP?

Creo que cualquiera de ellos haría en esta situación. ¿Pero cuál preferirías y por qué? Si es por algo que no sea una matriz?

+3

¿Qué tipo de matriz desea almacenar? La mayoría de los novatos toman las bases de datos de relaciones incorrectas y las usan mal. Siempre es mejor crear una tabla para una matriz de este tipo –

+1

Matrices con índices variables/volátiles y con un número variable de elementos. Sería casi imposible crear una estructura de tabla para los datos. –

+1

Duplicado de http://stackoverflow.com/questions/804045/preferred-method-to-store-php-arrays-json-encode-vs-serialize –

Respuesta

48

principal ventaja de serialize: es específico para PHP, lo que significa que puede representar tipos PHP, incluidas las instancias de sus propias clases - y obtendrá sus objetos hacia atrás, aún las instancias de sus clases, al revertir la seriación su datos.


principal ventaja de json_encode: JSON no es específico de PHP: hay bibliotecas para leer/escribir en varios idiomas - lo que significa que es mejor si usted quiere algo que se pueden manipular con otro idioma de PHP .

Una cadena JSON también es más fácil de leer/escribir/modificar a mano que una serializada.

Por otro lado, como JSON no es específico de PHP, no tiene conocimiento de las cosas que son específicas de los tipos de datos de PHP.


Como un par de Notas al margen:

  • Incluso si hay una pequeña diferencia de velocidad entre las dos anteriores, no debería importar demasiado: es probable que no serializar/unserialize una gran cantidad de datos
  • ¿Estás seguro de que esta es la mejor manera de almacenar datos en una base de datos?
    • Usted no será capaz de hacer mucho consultas sobre strins serializados, en un DB: usted no será capaz de utilizar sus datos en where cláusulas, ni actualizarla sin la intervención de PHP ...
+3

desde PHP 5.4.0 ahora puede personalizar la serialización JSON implementando el [JsonSerializable] (http://php.net /manual/en/class.jsonserializable.php) interfaz. –

+1

En su último punto, no hay ninguna razón por la que no pueda usar los contenidos de cadenas serializadas/json'd en cláusulas 'WHERE'. La idea general es que estos dos métodos reducen tipos complejos como matrices y objetos a la representación de cadenas. Estoy de acuerdo en que hay mejores formas de hacerlo si estás considerando usar una base de datos. También me gustaría agregar un bache a la cadena 'json_encode': es mucho más robusto ya que no depende de las longitudes para sus valores. – phatskat

4

En primer lugar, la serialización de una matriz u objeto y su almacenamiento en una base de datos suele ser un olor a código. A veces las personas terminan colocando una lista separada por comas en una columna y luego se meten en todo tipo de problemas cuando más tarde descubren que necesitan consultarla.

Así que piense con mucho cuidado sobre eso si este es ese tipo de situación.

En cuanto a las diferencias. PHP serialize es probablemente más compacto pero solo utilizable con PHP. JSON es multiplataforma y posiblemente más lento para codificar y decodificar (aunque lo dudo significativamente).

+0

Puede haber casos de uso válidos para esto. Una cola de la base de datos, por ejemplo. El blob nunca se consulta, simplemente se deserializa cuando se trata de procesar ese registro en la cola. –

+0

WordPress es un ejemplo común de PHP y la naturaleza de la tabla de publicaciones empuja al usuario hacia ese tipo de estructura. Entonces, en ese caso, funciona con el entorno de codificación, aunque obviamente no es relacional. – strattonn

2

Si los datos nunca tienen que salir de su aplicación PHP, recomiendo serialize() porque ofrece mucha funcionalidad adicional como los métodos __sleep() y __wakeup() para sus objetos. También restaura objetos como instancias de las clases correctas.

Si pasa los datos serializados a otra aplicación, debe usar JSON o XML para compatibilidad.

¿Pero almacenar un objeto serializado en una base de datos? Quizás deberías pensar en eso de nuevo. Puede ser un problema real después.

5

Otra ventaja de json_encode sobre serialize es el tamaño. Me di cuenta de que como yo estaba tratando de averiguar por qué nuestra memcache memoria utilizada estaba haciendo tan grande, y estaba tratando de encontrar maneras de reducir es:

<?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"; 

que le ofrece:

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 

Obviamente He tomado el ejemplo más extremo, ya que cuanto más corta es la matriz, más importante es la sobrecarga con serialización. Todavía de un sitio web de producción veo una matriz serializada que es 20% más grande que su equivalente json.

9

Hice algunos análisis sobre Json Encoding vs Serialization en PHP. Y descubrí que Json es mejor para datos simples y simples como una matriz.

ver los resultados de mis experimentos en http://blog.shozab.net/php-serialization-vs-json-encoding-for-an-array/

+1

gran visión general del rendimiento de json_ (encode/decode) vs. serialize()/unserialize().Me encantaría ver algunas otras perspectivas agregadas a su blog (o aquí), ya que no soy un experto en rendimiento. –

3

En primer lugar, gracias a Shozab Hasan y user359650 para estas pruebas. Me preguntaba qué opción era la mejor y ahora sé:

Para codificar una matriz simple, JSON que está bien con PHP Y JavaScript, tal vez otros idiomas.

Para codificar un objeto PHP, serializar es una mejor opción debido a la especificidad de los objetos PHP solo instanciable con PHP.

Para almacenar datos, almacene los datos codificados en un archivo o use MySQL con el formato estándar. Sería mucho más fácil recuperar tus datos. MySQL tiene excelentes funciones para obtener datos de la manera en que le gustaría obtenerlos sin tratamiento de PHP.

Nunca he hecho ninguna prueba, pero creo que el almacenamiento de archivos es la mejor manera de almacenar sus datos si la clasificación de archivos del sistema es suficiente para recuperar sus archivos en orden alfabético/numérico. MySQL es codicioso para este tipo de tratamiento y también utiliza el sistema de archivos ...