2013-02-26 1 views
2

Я провел много исследований о том, как создавать задания, выполняемые в фоновом режиме с помощью PHP.PHP Фоновая работа, не отображающая результатов

<?php 
    ignore_user_abort(true); // run script in background 
    set_time_limit(0); // run script forever 

    // get the size of the output 
    ob_start(); 
    include_once '';//many includes 
    //$contentLength = ob_get_length(); 
    // these headers tell the browser to close the connection 
    // once all content has been transmitted 
    //header("Content-Length: $contentLength"); 
    header('Connection: close'); 
    // flush all output 
    ob_end_flush(); 
    ob_flush(); 
    flush(); 

    // close current session 
    if (session_id()) session_write_close(); 


//lot of code, fetch query from DB with millions records and do calculations 

    ?> 

Когда я использую заголовок («Content-Length: $ contentLength»); сценарий ничего не возвращает. Когда я комментирую это, я получаю результаты за тысячу, используя лимит. Если я хочу получить все миллионы, сервер перестает отвечать на запросы через 3-4 минуты.

Мне просто нужно получить огромный отчет о статистике и не хочу, чтобы пользователь получил сообщение Достигнуто максимальное время выполнения. Я не хочу повышать лимит времени выполнения, так как предел неизвестен. Это может занять до часа. Мне нужно, чтобы он работал в фоновом режиме.

ответ

1

Мой подход заключается в обработке отчета в виде фрагментов, то есть 10000 строк в то время. Сохраните каждую вычисленную часть в виде файла, а затем объедините все файлы перед выводом. Вам нужно будет вызвать функцию обработки/создания фрагментов через Ajax. Таким образом, вы создаете один пользовательский опыт, но несколько задач на сервере. Затем вы можете отобразить прогресс, чтобы пользователь знал, что происходит, и вы также можете проверить, не упало ли оно.

+0

Да, это помогает. Хороший подход – dev