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