рдпрд╣ рдПрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдЪрдЯреАрдПрдордПрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ (рдбрд╛рдИ) рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ, рдлрд╛рдЗрд▓реЗрдВ рджреЗрддрд╛ рд╣реИ, рдЖрджрд┐ред - рд╕рдм рдХреБрдЫ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рд╣реИред 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()
рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╕рдорд╛рдзрд╛рди рд▓рдЧрддрд╛ рд╣реИред