Получение данных из MYSQL в JSON с использованием PHP

У меня есть следующий довольно простой тестовый PHP-код, который извлекает данные и помещает их в форматированный текст JSON.

Я получаю следующую ошибку.

Неустранимая ошибка: допустимый размер памяти 33554432 байт исчерпан (пытался выделить 1979603 байта) в /var/www/test.php в строке 33

Там, где строка 33 – это строка json_encode() .

Есть ли способ сделать это более эффективным? PHP.ini уже настроен на 32M как максимальный, поэтому размер от стандарта 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); ?> в  <?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); ?> 

Вероятно, вы кодируете очень большой набор данных. Вы можете кодировать каждую строку, одну строку за раз, а не кодировать ее за одну большую операцию.

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

Таким образом, каждый вызов json_encode() только кодирует небольшой массив, а не большой. Конечный результат тот же. Это ИМО решение, которое будет использовать меньше памяти.

Прекратите дублирование массива данных

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

что поможет уменьшить использование памяти

Используйте это:

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

В качестве первого рабочего порядка он установил что-то вроде 256M или даже 512M.

Вероятно, набор данных, который MySQL возвращает вам, довольно большой. Поэтому, даже если ваш PHP очень эффективен с точки зрения памяти, вы все равно получите ошибку OoM. Так как более жизнеспособное долгосрочное решение использует оператор LIMIT ( SELECT * FROM $table WHERE 1=1 LIMIT 0,30 (начало с индекса 0, получите 30 элементов).

EDIT: О, ничего себе, я даже не видел проблему из первого решения … Ну, может быть, неплохо было бы LIMIT ваш запрос 🙂

Вот мой первый json, который отлично работает

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