Как я могу создать длительный процесс в скрипте Perl CGI? - PullRequest
2 голосов
/ 08 июля 2010

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

Ответы [ 3 ]

3 голосов
/ 08 июля 2010

См. Просмотр длинных процессов через CGI .

С другой стороны, более эффективное управление памятью также может решить вашу проблему. Например, если вы одновременно читаете целые файлы в память, попробуйте написать скрипт так, чтобы он обрабатывал данные построчно или фрагментами фиксированного размера. Объявите ваши переменные в наименьшей возможной области видимости.

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

1 голос
/ 08 июля 2010

Если применимо, отключите вычисления / генерацию.

создайте демон или запланированное задание, которое создает статическую версию результатов, демон может создать новую версию результатов для событий (например,файлы изменены) или через определенные промежутки времени.

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

Примечание, если это не соответствует вашим потребностям, я 'я бы полностью отошел от CGI и заглянул в mod_perl или fastcgi , где у вас есть постоянные процессы perl для обработки запросов, что экономит накладные расходы на создание нового интерпретатора perl, загрузку модулей и т. д.

0 голосов
/ 08 июля 2010

Да, вы можете запустить другой perl-скрипт из perl-скрипта и затем выйти из вызывающего скрипта:

http://perldoc.perl.org/functions/fork.html

Пример кода:

#!/usr/bin/perl

my $pid = fork();
if (not defined $pid) {
    print "resources not avilable.\n";
} elsif ($pid == 0) {
    print "IM THE CHILD\n";
    sleep 5;
    print "IM THE CHILD2\n";
    exit(0);
} else {
    print "IM THE PARENT\n";
    waitpid($pid, 0);
}
print "HIYA\n";

Но это не сработает, если вы хотите, чтобы второй скрипт мог использовать CGI для связи с вашим веб-сервером / пользователем.Если вы выполняете Perl-скрипт как CGI, он должен вернуть результат пользователю.

Таким образом, у вас есть два способа решения этой проблемы:

  • Попытайтесь выяснить, почему вы используете столько памяти, и улучшите сценарий.

  • Если на самом деле нет способа уменьшить потребление памяти, вы можете использовать демонизированный perl-скрипткак рабочий процесс, который выполняет вычисления и возвращает результаты в ваш CGI-perl-скрипт, который должен дождаться результата перед завершением.

...