Как выполннить большой скрипт php через ajax?

Я не прошу какого то решения, просто хотя бы объяснить или натолкнуть в каком то направлении.

Есть скрипт который обрабатывает записи (не прямым запросов к mySQL, а через свой api). Он производит выборку из БД и потом делаем свои манипуляции с каждой записью. И постоянно идет ошибка о нехватки памяти на обработку скрипта...

Собственно вопрос, как можно разбить на последовательное выполнения (пошаговое выполнение) части кода или как правильно делать выполнение больших (загруженных) запросов?
  • Вопрос задан
  • 669 просмотров
Пригласить эксперта
Ответы на вопрос 3
kompi
@kompi
nullstack devoops
Сегментировать выборку. И передовать параметр смещения через ajax.
Экспериментальным путём выяснить кофмортный диапазон.
Например, есть 1000 записей, нужно их всех получить, обработать и отдать на клиент.
Клиент запрашивает первые 100 записей, сервер их обрабатывает и возвращает + смещение.
Клиент склеивает результаты и запрашивает следующую пачку со смещением.
Цикл повторяется до тех пор, пока число возвращаемых записей не станет меньше 100 или получит произвольный флаг/параметр на остановку.
Ответ написан
Stalker_RED
@Stalker_RED
Как вариант, посмотреть в профайлере на что именно расходуется память, и попробовать устранить утечку. Если не получится - тогда сегментировать.
Ответ написан
Комментировать
copist
@copist
Empower people to give
А. Экономь память
1. Храни как можно меньше данных в памяти. Запросы в БД делай через курсоры, чтобы извлекалось меньше записей. Не используй жадные выборки без перечисления полей (SELECT *) особенно если в запросе есть JOIN.
2. Не храни в памяти сырые данные. Копи суммы по каждой записи, веди счётчики где надо, вычисляй функции, даже формируй HTML по мере чтения, но целиком выборку в память не собирай.
Б. Используй очереди (RabbitMQ и другие) для реализации асинхронности, чтобы браузер не ждал бесконечно ответа. Ответ запрашивай отдельным запросом
В. ... или сделай сервер Comet и пусть PHP сам выдаст результат, когда закончит работу
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы