Добрый день.
Значит - я формирую Excel файл на сервере и сразу отдаю его в браузер. Сейчас запросы не тяжелые, файл маленький и это работает. Но рано или поздно ожидание превысит таймаут.
Вот в этом и заключается вопрос - как правильно формировать такие отчеты?
Сейчас проект на симфони, но раньше я такое уже делал - как сам понимал. Вот так было.
По нажатию на ссылку отправлял запрос на формирование, там в сессию писался путь где будет сохранен сформированный файл и отправлял запросы пока такой файл не появится, как появился - отдавал файл.
<a href="/" class="download-report">
<span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span>
Загрузить таблицу
</a>
$('.download-report').click(function (e) {
e.preventDefault();
waitingDialog.show();
$.get('start_gnerate_programs_info_report');
var download_interval = setInterval(function () {
$.get('is_programs_info_report_ready', function (is_programs_info_report_ready) {
if (is_programs_info_report_ready == 'yes') {
waitingDialog.hide();
clearInterval(download_interval);
location.href = 'get_programs_info_report';
} else if (is_programs_info_report_ready != 'no') {
clearInterval(download_interval);
waitingDialog.hide();
}
});
}, 3000);
});
class ProgramsInfoReportController
{
/**
* @param PDO $PDO
*/
public function startGenerateProgramsInfoReportAction(PDO $PDO)
{
$generation_start_time = time();
$file_location = $_SERVER['DOCUMENT_ROOT'] . '/tmp/' . $generation_start_time . '.xlsx';
$_SESSION['programs_info_report'] = $file_location;
session_write_close();
...
$this->generateExcelFile($programs_info, $file_location);
}
private function generateExcelFile($programs_info, $file_location)
{
...
$writer->save($file_location);
}
public function isProgramsInfoReportReadyAction()
{
if (isset($_SESSION['programs_info_report'])) {
if (file_exists($_SESSION['programs_info_report'])) {
echo 'yes';
} else {
echo 'no';
}
} else {
echo 'error';
}
}
public function getProgramsInfoReportAction()
{
$file_name = 'programs_info.xlsx';
if (isset($_SESSION['programs_info_report']) && (file_exists($_SESSION['programs_info_report']))) {
$file_location = $_SESSION['programs_info_report'];
header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header("Content-Length:" . filesize($file_location));
header("Content-Disposition: attachment; filename=$file_name");
header('Pragma: no-cache');
readfile($file_location);
unlink($file_location);
unset($_SESSION['programs_info_report']);
}
}
}