Coldfusion / время ожидания браузера - PullRequest
0 голосов
/ 21 июля 2011

У меня есть шаблон, выполняющий кучу манипуляций, я ожидаю, что это займет 30-45 минут, чтобы завершить его обработку ... У меня был НЕКОТОРЫЙ успех в установке моего приложения и сеансовых переменных на тайм-аут @ 2 часа. и я установил тайм-аут моего запроса на 9999 (который должен быть 2,77 часа) ...

Однако - кажется, что существует магический порог - где-то около 20-минутной отметки мой браузер переходит на белый экран (без вывода), и кажется, что двигатель CF также перестал работать над моей задачей ...

Кто-нибудь может предложить надежный способ сохранить этот процесс - до тех пор, пока он не будет завершен или не произойдет мой астрономический таймаут? кроме того, есть ли способ отправить отзыв в браузер, чтобы он не истекал ... Я пробовал cfflush, но, похоже, этого не происходит.

Ответы [ 5 ]

2 голосов
/ 21 июля 2011

Вы можете использовать cfthread для запуска процесса в отдельном потоке, а затем на странице, к которой вы обращаетесь в браузере, вы можете использовать javascript для периодического опроса системы на предмет проверки ее состояния.Например, во время продолжительного процесса в cfthread, когда вы работаете, вы можете установить переменные приложения, указывающие, что процесс все еще выполняется, и как далеко он продвигается, а также получить и сообщить о них в браузере.После его завершения вы можете очистить переменные или установить флаг завершения и т. Д., И страница отчета вашего браузера сможет указать, что она завершена.

1 голос
/ 22 июля 2011

Я настоятельно рекомендую рефакторинг кода для использования простой системы обмена сообщениями / очереди. Это займет не более 30 минут для внедрения (или написания простого с нуля!) И даст много преимуществ сверх решения этой проблемы.

Например, это не проход / неудача для всей операции. Если вы столкнетесь с ошибкой, скажем, через 1,5 часа, вы больше не будете делать весь процесс заново, только те части, которые потерпели неудачу.

Делая это таким образом, буквально нет предела тому, сколько обработки вы можете сделать, потому что вы будете добавлять и удалять из стека по мере необходимости.

Если вы дадите немного больше информации, я буду рад помочь вам разобраться в логических делениях, чтобы сделать это возможным.

0 голосов
/ 26 апреля 2012

У меня была такая же проблема.Обычно время ожидания браузера составляет 3 минуты, а с сервера ничего не отправляется.Для большинства из этих длительных операций мне удавалось периодически выводить точку, чтобы поддерживать работу браузера, но когда дело доходило до очень длинных запросов на импорт 20M записей из CSV-файла на стороне сервера, мне приходилось думать о другом.

cUrl был ответом.

Итак, вот что я сделал.

<?
function get_page($page)
{
    $ch = curl_init($page);
    curl_setopt($ch, CURLOPT_TIMEOUT, 0);
    curl_setopt($ch, CURLOPT_NOPROGRESS,false);
    curl_setopt($ch, CURLOPT_PROGRESSFUNCTION,'progress');
    curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ch);
}

function progress($clientp,$dltotal,$dlnow,$ultotal,$ulnow='')
{
    echo '. ';
    flush();
    return(0);
}



get_page('http://www.example.com/my_extremely_long_operation_script.php');

?>

Даже при отсутствии вывода с сервера, curl периодически обновляет ход загрузки.

Решено!

0 голосов
/ 21 июля 2011

Пожалуйста, не храните запросы в такой сессии.В зависимости от размера запроса и числа одновременных пользователей в системе, вы можете легко исчерпать память, что приведет к сбою некоторых текущих и всех последующих запросов.

База данных должна быть более чем способной обрабатыватьтяжелая атлетика.Я бы рискнул предположить, что большая часть обработки, которую вы выполняете в приложении, может быть повторно учтена, чтобы происходить непосредственно в базе данных и сэкономить вам значительное количество времени.

В любом случае, вы должны посмотреть на что-то вроде CFTHREAD, как упомянул Шон, на запланированное задание или систему очередей, чтобы справиться с таким длинным процессом, как этот.Скорее всего, пользователь не хочет ждать окончания процесса, прежде чем увидит следующий экран.Если им заранее скажут, что процесс длительный, они справятся с ожиданием, если смогут перейти к другим задачам.

0 голосов
/ 21 июля 2011

Если у вас есть процесс, работающий так долго, тогда вы захотите запустить его как запланированное задание.

Я думаю, что ваш браузер умирает.

Проверяли ли вы, запущен ли еще запрос?

<cfsetting requesttimeout= "3600" /> установит, что страница будет длиться час.Если вы запускаете его как запланированное задание, то время ожидания сеанса ни на что не должно повлиять.

...