Программирование => Perl => Тема начата: AnnA от 03 Августа 2005, 13:47:31
Название: fastcgi -> GetOverlappedResult()
Отправлено: AnnA от 03 Августа 2005, 13:47:31
Привет. :) Установлен Apache/2.0.54 (Win32) mod_fastcgi/2.4.2 +Perl5.6 на winXP mod_fastcgi - брала dll с сайта fastcgi.com проблема в том, что вот в такой конструкции скриптов:
[error] [client 127.0.0.1] (OS 109)Канал был закрыт. : FastCGI: comm with server "F:/www/cgi/second.fcg" aborted: GetOverlappedResult() failed, referer: [url]http://localhost/[/url] FastCGI: (dynamic) server "F:/www/cgi/second.fcg" (pid 3140) terminated with exit with status \'9\'
ну и дальше там всякие глупости о том, что мол будем перезвпускаться теперь долго и упорно. Ну вот у меня и появился такой вопрос: можно ли как-то избавиться от этого неудобства? или мне поможет только чудо? :) а. и еще вопрос... ой. нет. этот потом.
Название: fastcgi -> GetOverlappedResult()
Отправлено: NeoNox от 03 Августа 2005, 15:28:36
#!/usr/bin/perl -w use CGI::Fast qw(:standard);
while ($query = new CGI::Fast) { ............................................. }
Название: fastcgi -> GetOverlappedResult()
Отправлено: AnnA от 03 Августа 2005, 15:49:23
NeoNox пасиба. тут на форуме видела - скачала SNAP вот кусочек лога: Apache/2.0.54 (Win32) mod_fastcgi/2.4.3 configured -- resuming normal operations [notice] Server built: Apr 16 2005 14:25:31 [notice] Parent: Created child process 564 [notice] Child 564: Child process is running [notice] FastCGI: process manager initialized [notice] Child 564: Acquired the start mutex. [notice] Child 564: Starting 250 worker threads. [warn] FastCGI: (dynamic) server "F:/www/cgi/second.fcgi" started (pid 1512) [warn] FastCGI: (dynamic) server "F:/www/cgi/second.fcgi" (pid 1512) terminated with exit with status \'9\' [warn] FastCGI: (dynamic) server "F:/www/cgi/second.fcgi" restarted (pid 1276) [error] [client 127.0.0.1] (OS 109)Канал был закрыт. : FastCGI: comm with server "F:/www/cgi/second.fcgi" aborted: GetOverlappedResult() failed, referer: http://localhost/ [warn] FastCGI: (dynamic) server "F:/www/cgi/second.fcgi" (pid 1276) terminated with exit with status \'9\' [error] [client 127.0.0.1] FastCGI: incomplete headers (0 bytes) received from server "F:/www/cgi/second.fcgi", referer: http://localhost/ [warn] FastCGI: (dynamic) server "F:/www/cgi/second.fcgi" restarted (pid 328) [warn] FastCGI: (dynamic) server "F:/www/cgi/second.fcgi" (pid 328) terminated with exit with status \'9\' [warn] FastCGI: (dynamic) server "F:/www/cgi/second.fcgi" restarted (pid 1012) [warn] FastCGI: (dynamic) server "F:/www/cgi/second.fcgi" (pid 1012) terminated with exit with status \'9\' [warn] FastCGI: (dynamic) server "F:/www/cgi/second.fcgi" has failed to remain running for 30 seconds given 3 attempts, its restart interval has been backed off to 600 seconds
#!/usr/bin/perl -w =comment use CGI::Fast qw(:standard); $COUNTER = 0; while (new CGI::Fast) { print header; print start_html("Fast CGI Rocks"); print h1("Fast CGI Rocks"), "Invocation number ",b($COUNTER++), " PID ",b($$),".", hr; print end_html; } #===========2 variant use strict; use 5.004; use CGI::Fast qw(:standard :html3); my $Counter = 0; while (new CGI::Fast) { print header; print h3("$Counter++ $$"); } =cut
use CGI::Fast qw(:standard);
my $handling_request = 0; my $exit_requested = 0; my $request = FCGI::Request(); my $Counter = 0; while ($handling_request = ($request->Accept() >= 0)) { &do_request; $handling_request = 0; last if $exit_requested; }
$request->Finish(); } # EO sub do_request() $request->Finish();
но, увы. :( причем, если обрабатывать скрипт не через mod_fastcgi - он честно отрабатывает все чего от него требуется. SNAP то же не помог.
Название: fastcgi -> GetOverlappedResult()
Отправлено: AnnA от 03 Августа 2005, 15:52:42
ну. вернее - эти-то все три варианта работают все. но, когда я их перекладываю на скрипт second.fcgi - тогда выдается тот вот лог, который я привела в предыдущем посте.
Название: fastcgi -> GetOverlappedResult()
Отправлено: NeoNox от 03 Августа 2005, 15:58:19
Я не понял что значит "перекладываю"? Я вложил mod_fastcgi.dll который у меня работает как приведено выше.
Название: fastcgi -> GetOverlappedResult()
Отправлено: NeoNox от 03 Августа 2005, 15:59:06
Стоп, этот модуль для апача 1.3
Название: fastcgi -> GetOverlappedResult()
Отправлено: NeoNox от 03 Августа 2005, 16:02:33
Покажи мне все что относится к фастцги в httpd.conf (я тут подумал, а не баг ли это в связке фастцги_апач2?)
Название: fastcgi -> GetOverlappedResult()
Отправлено: AnnA от 03 Августа 2005, 16:11:57
ага. если быть дословной: Syntax error on line 192 of F:/usr/local/Apache2/conf/httpd.conf: Cannot load F:/usr/local/Apache2/modules/mod_fastcgi.dll into server: \\xcd\\xe5 \\xed\\xe0\\xe9\\xe4 \\xe5\\xed \\xf3\\xea\\xe0\\xe7\\xe0\\xed\\xed\\xfb\\xe9 \\xec\\xee\\xe4\\xf3\\xeb\\xfc.
Цитировать
NeoNox: Я не понял что значит "перекладываю"?
ну как... традиционно:
use strict; use CGI::Session qw/-ip-match/; use CGI::Carp qw(fatalsToBrowser); use CGI::Fast qw(:standard); тут я объявляю our (); да и «поехали»...
while ($query = new CGI::Fast) { ............................................. здесь вот куча кода моего всякого разного ............................................. }
Название: fastcgi -> GetOverlappedResult()
Отправлено: NeoNox от 03 Августа 2005, 16:13:49
ты используешь mod_fastcgi-SNAP-0404142202-AP2.dll ?
Название: fastcgi -> GetOverlappedResult()
Отправлено: NeoNox от 03 Августа 2005, 16:17:28
в блоке while есть exit где-нибудь?
Название: fastcgi -> GetOverlappedResult()
Отправлено: AnnA от 03 Августа 2005, 16:18:40
Цитировать
NeoNox: Покажи мне все что относится к фастцги в httpd.conf
Название: fastcgi -> GetOverlappedResult()
Отправлено: AnnA от 03 Августа 2005, 16:19:43
Цитировать
NeoNox: ты используешь mod_fastcgi-SNAP-0404142202-AP2.dll ?
ага. зря?
Цитировать
NeoNox: в блоке while есть exit где-нибудь?
не-а. нигде нету. специально проверила.
Название: fastcgi -> GetOverlappedResult()
Отправлено: NeoNox от 03 Августа 2005, 16:26:32
Цитировать
AnnA: ага. зря?
не знаю, не на чем проверить. Попробуй 1.3 поставить и посмотри как на нем всеработает.
Название: fastcgi -> GetOverlappedResult()
Отправлено: NeoNox от 03 Августа 2005, 16:28:08
Стоп, а почему ты не стартуешь FastCGIServer в хттпд.конфе?
Название: fastcgi -> GetOverlappedResult()
Отправлено: AnnA от 03 Августа 2005, 16:38:03
дык это.... :) в общем этот скрипт (ну, по идее) - этот вот на котрый ругается апач, он принимает из формы логин и пароль. соединяется с базой, ну работает там с сессиями. в общем - авторизует пользователя. Ну, а потом, в зависимости то того, кто пришел - редиректит каждой группе пользователей свой фрэймсет. ну просто у каждой группы ведь свои права для работы с базой. Так вот я и говорю, что, не через mod_fastcgi он нормально работает, но только довольно... скажем так - не быстро. пользователей много. почти 50 человек. Это я издалека пошла к вопросу
Цитировать
NeoNox: а почему ты не стартуешь FastCGIServer в хттпд.конфе?
тогда мне придется забивать туда ВСЕ скрипты, работающие с базой? я просто еще не разобралась с этим и пока решила проверить без старта в конфе. м?
Название: fastcgi -> GetOverlappedResult()
Отправлено: AnnA от 03 Августа 2005, 16:40:29
Цитировать
NeoNox: Попробуй 1.3 поставить и посмотри как на нем всеработает.
не. я пока не буду откатываться. хорошо? просто вычитала в умной книжке, что Apache2 намного более совместим с windows
Название: fastcgi -> GetOverlappedResult()
Отправлено: NeoNox от 03 Августа 2005, 16:40:36
Цитировать
AnnA: м?
не м! Все туда, иначе будешь работать в ЦГИ режиме. В доке-же все описано.
Название: fastcgi -> GetOverlappedResult()
Отправлено: AnnA от 03 Августа 2005, 16:45:12
Цитировать
NeoNox: не м! Все туда, иначе будешь работать в ЦГИ режиме.
ну блин... :) хорошо. а почему же он тогда без этого не работает? другие же работают. :( а с формой что, принципиально ничего не получится? жаль - уже нет сегодня времени всё проверить. :rolleyes: NeoNox спасибо Вам большое за массу потраченного на меня времени.
Название: fastcgi -> GetOverlappedResult()
Отправлено: NeoNox от 03 Августа 2005, 16:47:01
Цитировать
AnnA: а почему же он тогда без этого не работает?
Не знаю, нужно смотреть твой скрипт.
Название: fastcgi -> GetOverlappedResult()
Отправлено: AnnA от 03 Августа 2005, 17:53:22
use strict; use CGI; use CGI::Carp qw(fatalsToBrowser); use CGI::Fast;
our ($cgi, $login, $pass); $cgi = new CGI; $login = $cgi->param(\'user\') if $cgi->param(\'user\'); $pass = $cgi->param(\'passw\') if $cgi->param(\'passw\');
while (new CGI::Fast) { &head(); if (!$login or !$pass) { print $cgi->h4({-style=>\'color:red;text-align:center\'},\'empty login or password\'); } else { print $login,\' \',$pass,\' connect to db....\'; } } #while (new CGI::Fast)
sub head () { print $cgi->header(-charset=>\'windows-1251\', pragma=>\'no-cache\'), \'\'; }
всегда печатает: empty login or password
Название: fastcgi -> GetOverlappedResult()
Отправлено: NeoNox от 03 Августа 2005, 18:30:22
perldoc CGI::Fast в разделе WRITING FASTCGI PERL SCRIPTS
Название: fastcgi -> GetOverlappedResult()
Отправлено: AnnA от 04 Августа 2005, 13:25:08
NeoNox ага. Не работала у меня такая конструкция (вот убила некоторое кол-во времени на проверку практикой) потому, что я писала как оо. т.е. конструкция вида use CGI; use CGI::Fast; .......... $cgi = new CGI; почему-то не видит в теле while (new CGI::Fast) $login = $cgi->param(\'user\'); причем именно парам. остальные методы вызываются (например тот же print $cgi->header()), но достучаться до параметров из формы мне так и не удалось. зато конструкция: use CGI::Fast qw(:standard); замечательно выдает $login = param(\'user\'); в общем-то - это не очень хорошо, на мой взгляд. ну, что необходимо отказаться от использования оо кода. ну да ладно. "слишком хорошо - тоже нехорошо". наверное. вот теперь пришло время второго вопроса... :) получается, что, коль уж я стартую скрипт из конфига Апача - мне вовсе необязательно в этом скрипте использовать в теле этого скрипта нечто вроде: while (new CGI::Fast) { &process_request; } м? он ведь и так работает у меня как fastcgi-процесс при старте веб-сервера. нет? или я что-то непонимаю?
Название: fastcgi -> GetOverlappedResult()
Отправлено: NeoNox от 04 Августа 2005, 14:52:44
Нужно(обязательно!) запускать в цикле. При старте сервера порождаются процессы(можно задать их количество) и при запросе он отдается одному из потомков. Вот и вся примудрость. Это в доке тоже описано (;
Насчет оо.
var ($query);
while ($query = new CGI::Fast) { main(); }
sub main { print $query->param("user") }
Название: fastcgi -> GetOverlappedResult()
Отправлено: AnnA от 04 Августа 2005, 15:56:07
NeoNox :appl: :chmok: (+ не удалось поставить. обидно.) большое человеческое спасибо. всё работает и довольно быстро.
Название: fastcgi -> GetOverlappedResult()
Отправлено: NeoNox от 04 Августа 2005, 16:12:30