Конечно, это действительно зависит от вашего приложения и вашей системы, но обычно я выполняю задание cron, которое выполняет PHP-скрипт для периодической генерации отчетов. Вывод может быть сохранен в файловой системе или в базе данных. Таким образом, мои отчеты генерируются только один раз (а не каждый раз, когда пользователь пытается их загрузить) И они генерируются только при необходимости (ваш сценарий может проверить, нужно ли ему создавать отчет на основе каких-либо критериев изменения, которые у вас есть, или вы можете просто установите его для периодического создания новых отчетов). Чтобы все было просто, просто вызовите текущую веб-страницу с помощью wget или curl и создайте новую страницу на своем веб-сервере для загрузки сохраненных отчетов.
Единственная проблема этого подхода - пользователи могут загружать «устаревшие» отчеты (данные изменились, но отчеты не были обновлены). Если это действительно проблема, другим подходом будет оставить PHP-скрипт в фоновом режиме, проверяя наличие измененных данных и генерируя отчеты по мере необходимости.
Другой подход заключается в том, что вы можете просто продолжать создавать отчеты, когда пользователи пытаются их загрузить, но кэшировать результаты. Опять же, используя свои собственные критерии для конкретного приложения, вы проверяете, достаточно ли кэшированный отчет для немедленной загрузки, или генерируете новый отчет и кэшируете его. Вы можете даже объединить это с первым подходом, периодически генерируя новые отчеты, но если пользователь пытается загрузить устаревший отчет, немедленно создайте новый (заставив пользователя ждать 3-10 секунд).
В конечном итоге это зависит от вашей системы и вашего приложения.