2011-01-27 19 views
7

Ho il seguente codice PHP di prova abbastanza semplice che estrae i dati e li inserisce in testo formattato JSON.Ottenere dati da MySQL in JSON utilizzando PHP

ottengo il seguente errore ..

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 1979603 bytes) in /var/www/test.php on line 33

Dove linea 33 è la linea json_encode().

C'è un modo per rendere questo più efficiente? Lo PHP.ini è già impostato su 32 M come massimo, quindi dimensionato rispetto allo standard 8M!

<?php 
    require('../../admin/db_login.php'); 

    $db=mysql_connect($host, $username, $password) or die('Could not connect'); 
    mysql_select_db($db_name, $db) or die(''); 

    $result = mysql_query("SELECT * from listinfo") or die('Could not query'); 
    $json = array(); 

    if(mysql_num_rows($result)){ 
      $row=mysql_fetch_assoc($result); 
     while($row=mysql_fetch_row($result)){ 
      // cast results to specific data types 

      $test_data[]=$row; 
     } 
     $json['testData']=$test_data; 
    } 

    mysql_close($db); 

    echo json_encode($json); 


    ?> 

risposta

16

probabilmente si sta codificando un grande d ataset. È possibile codificare ogni riga, una riga alla volta invece di codificarla in un'unica grande operazione.

<?php 
require('../../admin/db_login.php'); 

$db=mysql_connect($host, $username, $password) or die('Could not connect'); 
mysql_select_db($db_name, $db) or die(''); 

$result = mysql_query("SELECT * from listinfo") or die('Could not query'); 

if(mysql_num_rows($result)){ 
    echo '{"testData":['; 

    $first = true; 
    $row=mysql_fetch_assoc($result); 
    while($row=mysql_fetch_row($result)){ 
     // cast results to specific data types 

     if($first) { 
      $first = false; 
     } else { 
      echo ','; 
     } 
     echo json_encode($row); 
    } 
    echo ']}'; 
} else { 
    echo '[]'; 
} 

mysql_close($db); 

In questo modo, ogni chiamata a json_encode() codifica solo una piccola matrice invece di un grande. Il risultato finale è lo stesso. Questa è la soluzione IMO che utilizzerà meno memoria.

+0

Mi piace! Molto bella! –

+0

@Lee: non convenzionale, ma in questo modo non è necessario memorizzare ogni riga in un array per la codifica successiva. –

+0

Sì, un buon approccio, anzi, corre anche più veloce in realtà! –

0

Come prima soluzione è possibile impostare qualcosa come 256 M o 512 M.

È probabile che il set di dati che MySQL sta tornando a voi sia piuttosto grande. Quindi, anche se il tuo PHP è molto efficiente in termini di memoria, otterrai comunque l'errore OoM. Così come una soluzione a lungo termine più valida utilizzare la dichiarazione LIMIT (SELECT * FROM $table WHERE 1=1 LIMIT 0,30 (inizio dall'indice 0, ottenere 30 articoli)

EDIT: Oh wow, non ho nemmeno visto il problema dalla prima soluzione ... Beh, ancora potrebbe essere una buona idea per la vostra richiesta LIMIT :-)

10

arresto duplicare la matrice dei dati

$json = array(); 

if(mysql_num_rows($result)){ 
     $row=mysql_fetch_assoc($result); 
    while($row=mysql_fetch_row($result)){ 
     // cast results to specific data types 

     $json['testData'][]=$row; 
    } 
} 

che contribuirà a ridurre l'uso della memoria

+0

Pffff, è stato sul punto di scrivere esattamente la stessa ... Nice one Marco. – acm

+0

sì mee anche: d +1 per quello: D – Edmhs

+0

Sì buon grido! Non sapevo che stavo duplicando lì per niente! Che ha funzionato con 16 byte, impostando su 64M ora si adatta :-) –

7

Utilizzare questo:

$result = mysql_query("SELECT * FROM listinfo"); 

$json = array(); 
$total_records = mysql_num_rows($result); 

if($total_records > 0){ 
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC)){ 
    $json[] = $row; 
    } 
} 

echo json_encode($json); 
+1

Perché stai usando 'if ($ total_records> = 1) {' e '$ total_records = mysql_num_rows ($ result);'? – neworld

+1

qualche spiegazione sarebbe carina –

0

Qui è la mia prima JSON che funziona perfettamente

<?php 
// connect to mysql server 
mysql_connect($host, $username, $password) or die('Could not connect'); 
// select the db name 
mysql_select_db($dbname); 
    // enter your sql query 
    $sql = "Select * from Order_Details"; 
// Creates temp array variable 
$temp = array(); 
// Gets table details 
$result = mysql_query($sql); 
// Adds each records/row to $temp 
while($row=mysql_fetch_row($result)) { 
    $temp[] = $row; 
} 
// Formats json from temp and shows/print on page 
echo json_encode($temp); 
?> 
Problemi correlati