У меня есть следующий довольно простой тестовый 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); ?>