2010-04-04 23 views
42

Quindi ho bisogno di codificare un array in PHP e archiviarlo in testo normale nel database MySQL, la mia domanda è: devo usare serialize() o json_encode()? Quali sono i vantaggi e gli svantaggi di ciascuno di essi?Serialize o json in PHP?

Penso che nessuno di loro avrebbe fatto in questa situazione. Ma quale preferiresti e perché? Se è per qualcosa di diverso da un array?

+3

Che tipo di array si desidera memorizzare? La maggior parte dei neofiti prende i database delle relazioni in modo errato e li abusa. È sempre meglio creare una tabella per tale array –

+1

matrici con indici variabili/volatili e con un numero variabile di elementi. Sarebbe quasi impossibile creare una struttura di tabella per i dati. –

+1

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

risposta

48

vantaggio principale di serialize: è specifico per PHP, il che significa può rappresentare tipi PHP, tra cui le istanze di proprie classi - e si otterrà gli oggetti indietro, ancora le istanze delle classi, quando deserializzazione, la tua dati.


vantaggio principale di json_encode: JSON non è specifico per PHP: ci sono le librerie di lettura/scrittura in diverse lingue - che significa che è meglio se si desidera qualcosa che può essere manipolato con un altro linguaggio di PHP .

Una stringa JSON è anche più facile da leggere/scrivere/modificare a mano di una serializzata.

D'altra parte, poiché JSON non è specifico per PHP, non è a conoscenza delle cose specifiche dei tipi di dati di PHP.


come un paio di note a margine:

  • Anche se c'è una piccola differenza di velocità tra i due, non dovrebbe importa molto: probabilmente non serializzare/unserialize un sacco di dati
  • Sei sicuro che questo sia il modo migliore per memorizzare i dati in un database?
    • Non sarà in grado di fare molto query sui strins serializzati, in un DB: non sarà in grado di utilizzare i dati in where clausole, nè aggiornarlo senza l'intervento di PHP ...
+3

da PHP 5.4.0 è ora possibile personalizzare la serializzazione JSON implementando [JsonSerializable] (http://php.net) /manual/en/class.jsonserializable.php). –

+1

Sul tuo ultimo punto - non c'è ragione per cui non puoi usare il contenuto delle stringhe serializzate/json nelle stringhe WHERE. L'idea generale è che questi due metodi riducono tipi complessi come matrici e oggetti alla rappresentazione di stringhe. Sono d'accordo che ci sono modi migliori per farlo se stai considerando l'utilizzo di un database. Mi piacerebbe anche aggiungere un bump alla stringa 'json_encode'd: è molto più robusto in quanto non si basa su lunghezze per i suoi valori. – phatskat

4

Prima di tutto serializzare un array o un oggetto e archiviarlo in un database è in genere un odore di codice. A volte le persone finiscono per mettere una lista separata da virgole in una colonna e poi entrare in tutti i tipi di problemi quando in seguito scoprono che hanno bisogno di interrogare su di essa.

Quindi pensaci bene se questo è il tipo di situazione.

Per quanto riguarda le differenze. Il serializzazione di PHP è probabilmente più compatto ma utilizzabile solo con PHP. JSON è multipiattaforma e forse più lento da codificare e decodificare (anche se dubito significativamente di ciò).

+0

Ci possono essere casi d'uso validi per questo. Ad esempio una coda di database. Il blob non viene mai interrogato ma semplicemente deserializzato quando si tratta di elaborare quel record nella coda. –

+0

WordPress è un esempio comune di PHP e la natura della tabella dei post spinge l'utente verso quel tipo di struttura. Quindi in tal caso funziona con l'ambiente di programmazione, anche se ovviamente non è relazionale. – strattonn

2

Se i dati non dovranno mai lasciare l'applicazione PHP, raccomando serialize() perché offre molte funzionalità extra come i metodi __sleep() e __wakeup() per gli oggetti. Ripristina anche oggetti come istanze delle classi corrette.

Se si passano i dati serializzati a un'altra applicazione, è necessario utilizzare JSON o XML per la compatibilità.

Ma archiviare un oggetto serializzato in un database? Forse dovresti pensarci di nuovo. Può essere un problema reale più tardi.

5

Un altro vantaggio di json_encode su serialize è la dimensione. Ho notato che mentre stavo cercando di capire il motivo per cui il nostro memcache memoria utilizzata è stato sempre così grande, e stava cercando di trovare modi per ridurre è:

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

che ti dà:

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 

Ovviamente Ho preso l'esempio più estremo, poiché più corto è l'array, più importante è il sovraccarico con serializzazione. Sempre da un sito di produzione vedo array serializzati del 20% più grandi del loro equivalente JSON.

9

Ho effettuato alcune analisi su Json Encoding vs Serialization in PHP. E ho scoperto che Json è il migliore per dati semplici e semplici come array.

vedere i risultati dei miei esperimenti in http://blog.shozab.net/php-serialization-vs-json-encoding-for-an-array/

+1

ottima panoramica delle prestazioni di json_ (codifica/decodifica) vs. serialize()/unserialize().Mi piacerebbe vedere altre prospettive aggiunte al tuo blog (o qui), perché non sono un esperto di prestazioni. –

3

In primo luogo, grazie alla Shozab Hasan e user359650 per questi test. Mi chiedevo quale fosse la scelta migliore e ora so:

Per codificare un array semplice, JSON che è OK sia con PHP che javascript, forse con altre lingue.

Per codificare un oggetto PHP, serializzare è una scelta migliore a causa della specificità di oggetti PHP solo instanziable con PHP.

Per memorizzare i dati, memorizzare i dati codificati in un file o utilizzare MySQL con il formato standard. Sarebbe molto più facile riavere i tuoi dati. MySQL ha grandi funzioni per ottenere i dati nel modo in cui ti piacerebbe ottenerli senza trattamento PHP.

Non ho mai effettuato alcun test, ma penso che l'archiviazione dei file sia il modo migliore per archiviare i dati se l'ordinamento dei file di sistema è sufficiente per recuperare i file in ordine alfabetico/numerico. MySQL è avido di questo tipo di trattamento e utilizza anche il file system ...