Получение данных из MYSQL в JSON с использованием PHP - PullRequest
7 голосов
/ 27 января 2011

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


    ?>

Ответы [ 5 ]

18 голосов
/ 27 января 2011

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

<?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, которое будет использовать меньше памяти.

10 голосов
/ 27 января 2011

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

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

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

7 голосов
/ 29 ноября 2012

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

$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);
0 голосов
/ 01 марта 2014

Вот мой первый 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 голосов
/ 27 января 2011

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

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

РЕДАКТИРОВАТЬ: Ого, я даже не видел проблему из первого решения ... Ну, все еще может быть хорошей идеей для LIMIT ваш запрос: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...