Прерванный CGI-скрипт Perl на стороне сервера при закрытии клиентского браузера - PullRequest
3 голосов
/ 09 августа 2010

Я уже некоторое время пытаюсь решить небольшую проблему, но, похоже, я не могу.

Я написал HTML-страницу, которая вызывает Perl CGI-скрипт при отправке формы.Этот CGI выполняет определенное количество задач на стороне сервера, и я заставил скрипт распечатать шаги этих задач в iframe на странице HTML.Дело в том, что , если клиент закрывает свой браузер или просто уходит со страницы, CGI-скрипт прерывается на стороне сервера.

HTML-код:

<form action="/path/to/script.cgi" method="post" enctype="multipart/form-data" target="processing">
 <p>File to analyse: <input type="file" name="filename" size="50"/></p>
 <p><input type="submit" name="Submit" value="Analyse" /></p>
</form></font></p>

<p style="margin-left: 20"><font face="Arial" size="2" color="#000000">Analysing the file may take a while</font></p>
<iframe name="processing" width="70%" height="300">

</iframe>

CGI-скрипт:

my $query = new CGI;
print $query->header(-type => 'text/plain');
function1();
function2_takesLongTime($parameter);
function3();

Итак, допустим, что «function1» просто подготавливает некоторые вещи для анализа файлов (создание папок и т. Д.).«function2» - большая функция (может длиться 15 минут).Это Perl-программа, и в ней много «отпечатков», которые из-за «text / plain» заголовка CGI перенаправляются в iframe html-страницы (без использования буферизации $ | в программе).httpd настроен так, что тайм-аут намного дольше 15 минут, поэтому он не приходит оттуда.«function3» - очистка.

Если клиент остается на html-странице, скрипт CGI работает отлично.если клиент остановлен (например, пользователь закрывает окно), функции 1 и 2 выполняются на стороне сервера, но после этого сценарий, по-видимому, прерывается, поскольку очистка не производится.

Я попытался запустить«function2» как независимая программа с системной командой или создающая библиотеку perl и вызывающая основную функцию этой библиотеки, все равно завершается тем же путем.Я подумал, что независимо от того, останется клиент на странице или нет, серверный скрипт все равно будет работать.Это из-за заголовка «text / plain» скрипта CGI, который не может быть возвращен клиенту, что скрипт прерван?

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

Ответы [ 2 ]

3 голосов
/ 09 августа 2010

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

Похоже, вы не знакомы с этой концепцией, поэтому я рекомендую очень простую: Qudo.Если вы сочтете это слишком ограничительным, переключитесь на Gearman , который, я думаю, является самым популярным в мире Perl (см. Интерфейсы Gearman::XS и Gearman).

TIMTOWTDI: Если вы можете полностью отказаться от среды исполнения, предоставляемой CGI.pm, см., Например, Catalyst's RunAfterRequest.

2 голосов
/ 10 августа 2010

Отслеживание длительных процессов через CGI обеспечивает простой способ решения этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...