PHP Длительный запрос выполняется дважды

Я борюсь с проблемой, возникающей только на очень долго выполняющихся запросах. У меня есть веб-приложение с возможностью экспортировать большой объем данных по требованию в файл XML. В зависимости от данных экспорт выполняется от секунды до нескольких минут. Я протестировал экспорт с небольшим объемом данных, и генерация xml и загрузка файлов работали хорошо. Затем я протестировал его с большим объемом данных, и генерация xml заняла около 30 минут (из-за большого количества запросов к базе данных). Но проблема для этого долго выполняющегося запроса заключается в том, что после генерации XML-файла он не загружается, а генерирует файл снова. При выполнении генерации XML снова появляется ошибка загрузки сайта. То же самое произошло с большим количеством данных и временем генерации XML более одного часа... Так почему же это происходит? Эта проблема возникает только для таких запросов, выполняемых около 30 минут или дольше. Возможно ли, что есть некоторый тайм-аут, который снова запускает запрос? Но генерация второго файла начинается точно после окончания первого, а не после фиксированной продолжительности.

1 ответ

Но генерация второго файла начинается точно после окончания первого, а не после фиксированной продолжительности.

Если вы используете файловые сеансы, блокировка файла сеанса позволит только одному запущенному PHP-сценарию получить доступ к этому файлу за один раз, что может объяснить блокировку и почему следующий запрос происходит, как только текущий сценарий завершается.

Для больших экспортов одним из вариантов является как-то обработать "автономно" в бэкэнде и проверить готовый файл. Например: запросить загрузку, сразу получить "ключ" и запустить php в бэкэнд. Затем браузер может продолжать проверять, завершен ли экспорт для "ключа", и загружать его, когда он будет готов. Позволяет пользователю начать экспорт и не беспокоиться о том, что браузер закрывается на полпути или загружать один и тот же экспорт несколько раз без регенерации.

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

Другие вопросы по тегам