Большой ассоциативный массив PHP из MySQL (> 20 000 строк ), превышение лимитов либо по памяти, либо по времени
Есть БД MySQL, 20 000 + записей, каждая строка - это 20 столбцов с разным форматом данных (int, varchar, text, date, time ... ) Мне поставили задачу одним нажатием кнопки выгрузить содержимое и записать в excel. Выборку пытался делать по 100, 1000, 2000 строк, в любом случае процесс занимает очень много времени, и в итоге получаю ошибку об отсутствии памяти, либо timeout. Существует ли способ создания больших ассоциативных массивов в PHP > 20 тыc элементов ???
Ответы (2 шт):
Выборку пытался делать по 100, 1000, 2000 строк, в любом случае процесс занимает очень много времени, и в итоге получаю ошибку об отсутствии памяти, либо timeout.
когда сталкивался с такой проблемой, добавлял в скрипт switch для остановки после определенного кол-во запросов.
switch ($i){
case 1000:
sleep(5);
break;
case 2000:
sleep(5);
break;
}
Проблема первая -- таймаут
Если вы собираетесь делать что-то грандиозное по нажатию на кнопку в веб-интерфейсе, то вам надо создать Задание, которое будет выполнятся отдельным процессом без ограничения на время выполнения (например по крону или через консьюмера очереди). Когда отдельный процесс завершит Задание, он пометит его как завершённое. Всё время пока отдельный процесс кряхтит переваривая ваши тысячи строк, пользователь веб-интерфейса просто спрашивает время от времени "ну как там? уже готово?" (polling). Такие пользовательские запросы выполняются быстро и не отваливаются по таймауту.
Проблема вторая -- лимит памяти
Если ваш скрипт ворочает очень большими данными, вам следует постараться сделать так, чтобы можно было зафиксировать часть сделанной работы, освободить память и приступить к следующей части.
В вашем случае можно получать данные по несколько строк (например по 1000), записывать в конец csv-файла (как вам советуют в комментариях) и повторять это пока строки в таблице не закончатся. Но помните, что этим должен заниматься отдельный процесс, а не обработчик пользовательского запроса.
Попробую изобразить, как мог бы происходить такой процесс:
Вы можете сделать разбор Задач через постоянно запускающийся cron-скрипт или использовать gearman или брокер очередей вроде rabbitmq.
