2011-01-27 14 views
7

Verileri ayıklayan ve JSON biçimlendirilmiş metne koyan aşağıdaki oldukça basit bir test PHP koduna sahibim.MYSQL'den JSON'a JSON kullanarak veri alma

aşağıdaki hatayı alıyorum ..

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

hat 33 json_encode() çizgidir yere.

Bunu daha verimli hale getirmenin bir yolu var mı? PHP.ini zaten maksimum olarak 32M'ye ayarlanmış, bu nedenle 8M standardından büyük!

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


    ?> 

cevap

16

muhtemelen çok büyük kodluyorsanız d ataset. Her satırı, tek bir işlemde kodlamak yerine her seferinde bir satır kodlayabilirsiniz.

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

Bu şekilde, json_encode() her arama yerine sadece büyük bir küçük bir dizi kodlar. Son sonuç aynıdır. IMO, daha az belleği kullanacak olan çözümdür.

+0

Bunu beğendim! Çok hoş! –

+0

@Lee: Geleneksel olmayan, ancak bu şekilde her satırı daha sonra kodlamak için bir diziye kaydetmek zorunda kalmazsınız. –

+0

Evet, gerçekten güzel bir yaklaşım, aslında daha hızlı çalışır! –

0

İlk çalışma olarak bunu 256M veya hatta 512M gibi bir değere ayarlayın.

MySQL'in size geri döndüğü veri kümesi oldukça büyüktür. Yani, PHP'niz çok bellek verimli olsa bile, hala OoM hatasını alacaksınız. Bu nedenle, daha uygun bir uzun vadeli çözüm olarak LIMIT bildirimini kullanın (SELECT * FROM $table WHERE 1=1 LIMIT 0,30 (0 dizininden başlayın, 30 öğe alın)

DÜZENLEME: Oh vay, problemi ilk çözümden görmedim ... Eh, hala

10

Dur senin bellek kullanımı azaltmaya yardımcı olacaktır veri

$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; 
    } 
} 

dizinizi çoğaltarak :-) Sorgunuzla LIMIT için iyi bir fikir olabilir

+0

Pffff işleri benim ilk json, tam olarak aynı ... Güzel bir Mark yazmak için yaklaşık idi. – acm

+0

evet mee too: bunun için d +1: D – Edmhs

+0

Evet iyi not! Orada çoğaltıyor olduğumu anlamadım! Bu, 16 bayt üzerinde çalışmış, şimdi 64M'ye ayarlıyor :-) –

7

kullanın bu bir:

$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

Neden kullanıyorsunuz? If ($ total_records> = 1) {'ve' $ total_records = mysql_num_rows ($ sonuç); '? – neworld

+1

bazı açıklamalar güzel olurdu –

0

Burada mükemmel

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