рдХреЛрд░реЛ рдореЗрдВ рдЧреЛрдЯреЛ :: рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдп :: рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ - рд░реЗрдХ рдХрд╣рд╛рдБ рд╣реИ?

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ CGI рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ FastCGI рдХреЗ рддрд╣рдд рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдпрд╣ рдПрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдЪрдЯреАрдПрдордПрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ (рдбрд╛рдИ) рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ, рдлрд╛рдЗрд▓реЗрдВ рджреЗрддрд╛ рд╣реИ, рдЖрджрд┐ред - рд╕рдм рдХреБрдЫ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рд╣реИред STDOUT рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рд░реВрдкрд░реЗрдЦрд╛, exit() - рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рдореВрд▓ рдирд╣реАрдВ рд╣реИред

рдЗрд╕ exit() рдХреЛ eval() , рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрдИ рдиреЗрд╕реНрдЯреЗрдб eval-s рдХреЗ рдЕрдВрджрд░ рднреА рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХрд╣реАрдВ, рдЧрдгрдирд╛ рдХреА рдЧрд╣рд░рд╛рдИ рдореЗрдВ, CGI рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдпрд╣ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ print "Location: ..." рдФрд░ exit() print "Location: ..." рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди FastCGI рдХреЗ рддрд╣рдд exit() рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рдирд┐рдХрд╛рд╕ рдХреЛ рд░реЛрдХрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╛ рддреЛ die() (рдЬреИрд╕реЗ mod_perl рдХрд░рддрд╛ рд╣реИ , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдпрд╛ goto ред die() рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ exit() рдХреЛ eval() рдЕрдВрджрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ eval рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЙрд▓ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЕрдЬреНрдЮрд╛рдд рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ die() рдлрд┐рд░ рд╕реЗ (рд▓реЗрдХрд┐рди рдЗрд╕ CGST рдмреЙрдХреНрд╕ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрд╡рд░реНрдЬрди рдХреЗ рдмрд╛рдж рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП die() рдореИрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ - рдмрд▓реНрдХрд┐, рдореИрдВ рдЧрд╛рд░рдВрдЯреА рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ), рдлрд┐рд░ exit() рдмрд╕ рдирд┐рдХрдЯрддрдо рдирд┐рд╖реНрдХрд╛рд╕рди eval() рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдХрд┐ рдЙрд╕ рд╕реАрдЬреАрдЖрдИ рд╢реЙрдк рдХрд╛ рдХрд╛рд░рдг рд╣реИ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧрд┐рдирддреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ!

CGI рдЫрджреНрдо рдХреЛрдб


sub that_cgi_script {
...
eval { do_something() };
...
}
sub do_something {
# 1) may return if everything ok
# 2) may die on error, but such error non-important to
# calling code in above case and will be catched by
# eval and ignored
# 3) may redirect: print Location header and call exit()
}

рдорд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк


my $FCGI_EXIT = "FCGI NORMAL EXIT\n";
BEGIN { *CORE::GLOBAL::exit = sub { die $FCGI_EXIT }; }
while (CGI::Fast->new()) {
eval { that_cgi_script(); };
die $@ if $@ && $@ ne $FCGI_EXIT;
$CGI::Fast::Ext_Request->Finish();
}

рдЧреЛрдЯреЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднрд┐рдиреНрдирддрд╛


BEGIN { *CORE::GLOBAL::exit = sub { goto EXIT }; }
while (CGI::Fast->new()) {
eval { that_cgi_script(); };
die $@ if $@;
EXIT:
$CGI::Fast::Ext_Request->Finish();
}

рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ?


рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╕рдмрд░реВрдЯреАрди рдпрд╛ "рдлреЛрд░рдЪ" рд▓реВрдкред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдРрд╕реЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реЛ, рдпрд╛ "рд╕реЙрд░реНрдЯ" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рдХрд┐рд╕реА рдмреНрд▓реЙрдХ рдпрд╛ рд╕рдмрд░реВрдЯреАрди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗред

рддреЛ рд░реЗрдХ рдХрд╣рд╛рдБ рд╣реИ?


рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ goto рд╕рд╛рде рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛ рдХреЙрд▓ exit() рдЕрдВрджрд░ рдХреА sort ред :) рдореБрдЭреЗ рдкреВрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ CGI рдРрд╕рд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЖрдореАрдиред

CORE::GLOBAL::exit рдореЗрдВ goto рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдФрд░ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ CORE::GLOBAL::exit ? рдореБрдЭреЗ рдХреНрдпрд╛ рдЪрд┐рдВрддрд╛ рд╣реИ рдХрд┐ mod_perl goto рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ die() рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╕рдорд╛рдзрд╛рди рд▓рдЧрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In13681/


All Articles