Назад | Перейти на главную страницу

Как мне заставить Apache завершить выполнение сценариев Perl после закрытия веб-браузера?

У меня есть сценарий Perl, который активируется конечным пользователем, щелкнув ярлык в веб-браузере. Сценарий перебирает список хеш-значений. Он выводит в браузер некоторый HTML, когда вставляет строку в базу данных для каждой итерации. Среда была Perl, Windows Server 2003 Standard Edition, IIS. Я недавно перешел на Apache. Традиционно количество итераций было небольшим, и большинство пользователей закрывали браузер после завершения загрузки страницы. Теперь у нас есть случай, когда существует до 5000 итераций. Теперь выполнение этих 5000 итераций занимает много времени (1 мин ~). Это не проблема. Проблема в том, что когда пользователь закрывает веб-браузер, Apache убивает Perl-скрипт, и мы не завершаем вставку строк в базу данных, потому что браузер не подтверждает последний отправленный HTML-код. Я тестировал это в IIS, и после того, как пользователь закрывает веб-браузер, Perl-скрипт продолжает работать, и все строки вставляются. Есть ли в конфигурационном файле Apache параметр, который заставит Apache завершить выполнение сценария Perl даже после закрытия браузера и сброса сокета?

Вот что мы делаем:

foreach my $Destination (sort keys %{$self->{_Destinations}}) {
   print qq! <td $self->{_bgcolor}>$Destination Queued</td> !;

   if ($self->{_Data}->Execute(@params))   {&error}
}

Я знаю, что мы должны сделать все вставки в базу данных, а ЗАТЕМ выполнить нашу печать, но это устаревший код, и если бы я мог просто заставить Apache вести себя как IIS в этом отношении, у меня было бы время, чтобы более тщательно переписать этот скрипт .

Вам нужно поставить любую работу, которая должен происходит, даже если браузер закрыт / соединение прерывается в фоновом режиме. Используйте рабочую очередь (мне нравится resque, но практически все будет работать) и обработчик заданий, чтобы получить задания и выполнить необходимую вставку. Вопросы о написании этого кода лучше всего задавать в stackoverflow.

На сервере Unix в сценариях Perl вы можете попробовать игнорировать сигналы, например,

$SIG{'TERM'}='IGNORE';
$SIG{'HUP'}='IGNORE';
$SIG{'PIPE'}='IGNORE';

Это, вероятно, бесполезно, если вы используете серверы Windows.

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