Почему браузер зависает, когда я регистрирую обработчик очистки в mod_perl? - PullRequest
4 голосов
/ 05 января 2010

Я использую $r->pool->cleanup_register(\&cleanup); для запуска подпрограммы после обработки страницы и ее печати клиенту. Я надеялся, что клиент увидит всю страницу, и Apache сможет продолжить некоторую обработку в фоновом режиме, которая занимает несколько секунд.

Но клиентский браузер зависает до тех пор, пока не вернется подпрограмма очистки. Есть ли способ заставить apache завершить соединение с клиентом до того, как весь мой код вернется?

Я убежден, что делал это раньше, но я не могу найти это снова.

Ответы [ 2 ]

1 голос
/ 06 января 2010

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

0 голосов
/ 05 января 2010

Вы хотите очистить буфер. Он не завершает соединение, но ваш клиент увидит вывод до завершения задачи.

sub handler {
      my $r = shift;
      $r->content_type('text/html');
      $r->rflush; # send the headers out

      $r->print(long_operation());
      return Apache2::Const::OK;
  }
...