572 votos

Método preferido para almacenar las matrices PHP (json_encode vs serializar)

Necesito almacenar múltiples dimensiones de un array asociativo de datos en un archivo plano para almacenar en caché los efectos. Yo de vez en cuando puede venir a través de la necesidad de convertir a JSON para su uso en mi web app, pero la gran mayoría del tiempo voy a estar usando la matriz directamente en PHP.

Sería más eficiente para almacenar la matriz como JSON o como PHP serializado matriz en este archivo de texto? He mirado y parece que en las últimas versiones de PHP (5.3), json_decode es en realidad más rápido que unserialize.

Actualmente estoy inclinando hacia el almacenamiento de la matriz como JSON, ya que siento que es más fácil de leer por un ser humano, si es necesario, puede utilizarse en PHP y JavaScript, con muy poco esfuerzo, y por lo que he leído, podría ser incluso más rápido para decodificar (no estoy seguro acerca de la codificación, aunque).

¿Alguien sabe de alguna trampas? Alguien tiene buenos puntos de referencia para mostrar las ventajas de rendimiento de cualquiera de los dos métodos?

Gracias de antemano por cualquier ayuda.

534voto

Peter Bailey Puntos 62125

Depende de sus prioridades.

Si el rendimiento es la más absoluta de conducción característica, entonces por todos los medios el uso de la más rápida. Sólo asegúrese de que usted tiene una comprensión completa de las diferencias antes de tomar una decisión

  • JSON convierte los caracteres UTF-8 a secuencias de escape de unicode. serialize() no.
  • JSON tendrá ningún recuerdo de lo que el objeto de la clase original era (que siempre se restauran como instancias de stdClass).
  • Usted no puede aprovechar __sleep() y __wakeup() con JSON
  • Sólo las propiedades públicas se serializa con JSON
  • JSON es más portátil

Y probablemente hay otras diferencias no puedo pensar en el momento.

Un sencillo test de velocidad para comparar los dos

<?php

ini_set( 'display_errors', 1 );
error_reporting( E_ALL );

//  Make a bit, honkin test array
//  You may need to adjust this depth to avoid memory limit errors
$testArray = fillArray( 0, 5 );

//  Time json encoding
$start = microtime( true );
json_encode( $testArray );
$jsonTime = microtime( true ) - $start;
echo "JSON encoded in $jsonTime seconds<br>";

//  Time serialization
$start = microtime( true );
serialize( $testArray );
$serializeTime = microtime( true ) - $start;
echo "PHP serialized in $serializeTime seconds<br>";

//  Compare them
if ( $jsonTime < $serializeTime )
{
    echo "json_encode() was roughly " . number_format( ($serializeTime / $jsonTime - 1 ) * 100, 2 ) . "% faster than serialize()";
}
else if ( $serializeTime < $jsonTime )
{
    echo "serialize() was roughly " . number_format( ($jsonTime / $serializeTime - 1 ) * 100, 2 ) . "% faster than json_encode()";
} else {
    echo 'Unpossible!';
}

function fillArray( $depth, $max )
{
    static $seed;
    if ( is_null( $seed ) )
    {
        $seed = array( 'a', 2, 'c', 4, 'e', 6, 'g', 8, 'i', 10 );
    }
    if ( $depth < $max )
    {
        $node = array();
        foreach ( $seed as $key )
        {
            $node[$key] = fillArray( $depth + 1, $max );
        }
        return $node;
    }
    return 'empty';
}

232voto

Greg Puntos 132247

JSON es más sencillo y rápido que PHP formato de serialización y debe ser usado a menos que:

  • Usted está almacenando profundamente matrices anidadas: json_decode(): "Esta función devolverá false si la codificado en JSON de datos de más de 127 elementos."
  • Usted está almacenando objetos que deben ser deserializada como la clase correcta
  • Estás interactuando con las viejas versiones de PHP que no admiten json_decode

58voto

Taco Puntos 381

He escrito un post sobre este tema: "una gran variedad de caché: JSON, serializar o var_export?". En este post se demuestra que serializar es la mejor opción para pequeñas y grandes matrices de tamaños. Para arreglos de discos muy grandes (> 70MB) JSON es la mejor opción.

51voto

GingerDog Puntos 504

Usted también podría estar interesado en https://github.com/phadej/igbinary - que es muy diferente a la serialización de 'engine' para PHP.

Mi aleatoria/'arbitrarias' performance ' cifras, utilizando PHP 5.3.5 en una demostración de la plataforma de 64 bits :

JSON :

  • Codificado en JSON en 2.180496931076 segundos
  • JSON decodificado en 9.8368630409241 segundos
  • serie "Cadena" tamaño : 13993

Nativa de PHP :

  • PHP serializado en 2.9125759601593 segundos
  • PHP deserializada en 6.4348418712616 segundos
  • serie "Cadena" tamaño : 20769

Igbinary :

  • GANAR igbinary serializado en 1.6099879741669 segundos
  • GANAR igbinrary deserializada en 4.7737920284271 segundos
  • GANAR la serie "Cadena" Tamaño : 4467

Así, es más rápido igbinary_serialize() y igbinary_unserialize() y utiliza menos espacio en disco.

He utilizado el fillArray(0, 3) código como el anterior, pero la matriz de teclas de cadenas más largas.

igbinary puede almacenar los mismos tipos de datos como PHP nativo de serializar puede (Así que no hay problema con los objetos, etc) y se puede decir de PHP5.3 a utilizar para el manejo de sesiones si así lo desea.

Ver también http://ilia.ws/files/zendcon_2010_hidden_features.pdf - específicamente diapositivas 14/15/16

24voto

Blunk Puntos 179

Y sólo probado serializado y json codificar y decodificar, además el tamaño tomará la cadena almacenada.

JSON encoded in 0.067085981369 seconds. Size (1277772)
PHP serialized in 0.12110209465 seconds. Size (1955548)
JSON decode in 0.22470498085 seconds
PHP serialized in 0.211947917938 seconds
json_encode() was roughly 80.52% faster than serialize()
unserialize() was roughly 6.02% faster than json_decode()
JSON string was roughly 53.04% smaller than Serialized string

Podemos concluir que JSON codifica más rápido y da como resultado una cadena más pequeña, pero unserialize es más rápido para decodificar la cadena.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: