kylt_lichnosti
@kylt_lichnosti

Как правильно формировать относительно долгий отчет?

Добрый день.
Значит - я формирую 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']);
        }
    }
}
  • Вопрос задан
  • 223 просмотра
Решения вопроса 1
dimonchik2013
@dimonchik2013
non progredi est regredi
все так, как и делали + ссылку на почту / в мемербзону

либо предгенерация
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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