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

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ 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()



рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╕рдорд╛рдзрд╛рди рд▓рдЧрддрд╛ рд╣реИред



All Articles