У меня есть сценарий 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.
Что касается унис, это может вызвать другие проблемы.