Переполнение памяти в PHP как исправить?
Allowed memory size of 134217728 bytes exhausted (tried to allocate 75 bytes).
Я делаю запрос на полную выдачу 100 000 записей в базе данных и на нем почему-то вываливается эта ошибка.
Код обработки запроса у меня такой:
Код:
$data = array();
$i = 0;
while($row = mysql_fetch_assoc($query)){ //ошибка указывает на эту строку
$data[] = $row; //без этого все работает, получается переполняется массив?
$i++;
if($i > 60030) break; // опытным путем я выяснил, что вылетает после этой итерации :)
}
print_r($data);
$i = 0;
while($row = mysql_fetch_assoc($query)){ //ошибка указывает на эту строку
$data[] = $row; //без этого все работает, получается переполняется массив?
$i++;
if($i > 60030) break; // опытным путем я выяснил, что вылетает после этой итерации :)
}
print_r($data);
- Это функция, которая возвращает двумерный массив с записями. Может быть как-то можно разбить массив? от IVaN4B, 26 февраля 2013 года
Наслаждайся. Хотя я бы всё-таки рекомендовал не использовать такие массивы. Одно дело буфер на 64кб, и совсем другое неповоротливые многомегабайтные монстры, фрагментирующие память. Выводи порциями. Более чем уверен, что никому не понадобится отображение 60 000 записей из ДБ. Либо нужно сузить границы поиска, либо выводить фрагментами. Страницами, как наиболее простой вариант, или подгружать по мере прокручивания списка и освобождать то, что осталось за границей видимости. Если же нужно произвести какие-то вычисления над этими записями или ту же выборку - сделай это на стороне сервера, в хранимой процедуре, и дёргай её из PHP.
А зачем тебе такой здоровенный массив на 60000 записей?
Чтобы вывести записи в БД на экран, необязательно их предварительно загонять в массив, можно в самом цикле перебора выводить.
Цитата: int
http://www.php.net/manual/en/ini.core.php#ini.memory-limit
А зачем тебе такой здоровенный массив на 60000 записей?
А зачем тебе такой здоровенный массив на 60000 записей?
Это функция, которая возвращает двумерный массив с записями. Может быть как-то можно разбить массив?
Решение как бы напрашивается само собой: ограничить выбор количества записей из БД.
Цитата: mfender
Решение как бы напрашивается само собой: ограничить выбор количества записей из БД.
То есть ограничивать большие запросы, а если надо получить много записей, то выбирать их по частям?
Просто в таких случаях нужно думать уже не об PHP, а о собственном серванте, настраиваемом под нужды.
UPD. Как-то работал в одной конторе, где склад имел более четырех миллионов артикулов. Разумеется со стандартным хостингом это немыслимо. Это свои компутеры со своими настройками.