En mi aplicación tengo que cachear un array asociativo multi-dimensional en un archivo plano. No es habitual, pero algunas veces también tengo que convertir estos contenidos a JSON para servirlos en mi aplicación web. Pero casi siempre utilizaré el array PHP directamente sin convertirlo a JSON.
¿Cuál sería la forma más eficiente de guardar el array, convertirlo a JSON o serializarlo directamente? Al parecer en las versiones PHP más recientes la función json_decode()
es más rápida que unserialize()
.
En estos momentos estoy más decidido a utilizar JSON porque es mucho más sencillo de leer por parte de los humanos en caso de que sea necesario. Además, con JSON puedo utilizar la información directamente en PHP y JavaScript.
¿Alguien podría indicarme algunas diferencias y ventajas/desventajas de cada método? ¿Alguien tiene benchmarks que comparen el rendimiento de cada método?
Muchas gracias por la ayuda.
Estás leyendo una traducción autorizada de la pregunta Preferred method to store PHP arrays (json_encode vs serialize) planteada por KyleFarris en StackOverflow.
Respuestas
Como casi siempre, la respuesta depende de tus necesidades.
Si el rendimiento es lo más importante para tí, sin duda deberías elegir el método más rápido de los dos. Pero asegúrate de entender bien las diferencias entre los dos:
json_encode()
por defecto convierte los caracteres UTF-8 en secuencias de escape Unicode, mientras queserialize()
no lo hace. Nota: a partir de PHP 5.4 puedes utilizar la opciónJSON_UNESCAPED_UNICODE
para desactivar este comportamiento.- La estructura de datos JSON no guarda ninguna referencia sobre la clase del objeto que se trasformó. Por eso nunca podrás recuperar la clase original y siempre obtendrás como resultado la clase
stdClass
de PHP. - No puedes usar los métodos mágicos
__sleep()
y__wakeup()
con JSON. - JSON solamente serialize las propiedades
public
, por lo que perderás las propiedadprotected
yprivate
.
Otros programadores aseguran que siempre se debería utilizar JSON porque es más rápido y sencillo que la serialización de PHP, salvo que:
- Almacenes arrays muy complejos, ya que
json_decode()
tiene un límite de 127 niveles de anidamiento de arrays. - Debas almacenar la clase original del objeto para que al deserializar la información obtengas exactamente el mismo objeto.
- Tengas que dar soporte a versiones PHP muy viejas que no soportan
json_decode()
.
@librosweb