it-swarm.com.ru

Получение данных из 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);


    ?>
7
Lee Armstrong

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

<?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() кодирует только маленький массив вместо большого. Конечный результат такой же. Это решение IMO, которое будет использовать меньше памяти.

18
Andrew Moore

Хватит дублировать ваш массив данных

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

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

10
Mark Baker

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

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

Вот мой первый 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);
?>
0
Ananth

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

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

Правка: Ого, я даже не видел проблему из первого решения ... Ну, все еще может быть хорошей идеей для LIMIT вашего запроса :-)

0
Zsub