Используйте небуферизованные запросы, неявную очистку, отправляйте данные непосредственно в выходной буфер (для загрузок), используйте CLI (для экспорта файлов).Выключите / увеличьте ограничения по времени (если необходимо) только для этого сценария, а не глобально.
http://php.net/manual/en/mysqlinfo.concepts.buffering.php
http://php.net/manual/en/wrappers.php.php
Как очистить вывод послекаждый вызов `echo`? (ответ @Roger)
http://php.net/manual/en/function.set-time-limit.php
Слишком много кода для меня, чтобы написать все это, и слишком много неизвестного.Например, какую БД вы используете (MySQL, MsSQL и т. Д.), Какие классы БД, PDO или MySqli?Вы экспортируете в файл на сервере или скачиваете.Вам нужны данные в формате CSV, SQL и т. Д.
- Не буферизация запроса обойдется дороже, займет больше времени, но лучше управляет памятью и лучше обрабатывает большие таблицы.
- Неявная очистка поддерживает малый размер выходного буфера (управление памятью).
- Отправка данных на
php://output
улучшает управление памятью и повышает ее эффективность. - Ограничение по времени должно быть очевидным.
Мой цикл функций в каждом поле и выполнение функции для получения данных из таблицы sql.
Используйте Joins вместо повторного вызова БД, используйте правильные индексы для ваших таблиц.
Можно использовать ini_set('memory_limit' ...)
и set_time_limit
, потому что они влияют только на текущий процесс PHP и не являются глобальными.Очевидно, что лучше избегать их, если вы можете, но иногда это просто невозможно.
Самый быстрый способ экспорта - mysqldump
:
https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html
Но этоимеет ограничения (например)
https://dba.stackexchange.com/questions/4654/is-it-possible-to-mysqldump-a-subset-of-a-database-required-to-reproduce-a-query
Вы не можете экспортировать с помощью JOIN, и сложные запросы станут очень сложными, потому что я думаю, что вы можете использовать только базовый --where
вызов,нет агрегации .. и т. д.