के तहत बंद प्रतिक्रिया मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या मुख्य हैंडलर पर लौटने के बिना mod_perl 2 के तहत प्रतिक्रिया पूरी करने का कोई तरीका है या नहीं। अब तक दस्तावेज़ों में इसके लिए कोई विधि नहीं ढूंढ पाई है। मैं बस सकता है नया प्रतिक्रिया के साथ exit()
एक नियमित रूप से पर्ल स्क्रिप्ट मेंmod_perl 2
#!/usr/bin/perl
# This is some mod_perl handler
use strict;
use warnings;
use Apache2::Const ':common';
sub handler {
my $r = shift;
if ($r->method eq 'POST') {
# just to do something as example
do_post_response($r);
}
$r->content_type('text/plain');
print "Thank you, goodbye.";
return Apache2::Const::OK;
}
sub do_post_response {
my $r = shift;
unless (check_somthing()) {
# Suppose I find a situation that requires
# a different response than normal...
$r->content_type('text/plain');
print "We have a situation...";
$r->something_to_finish_the_request_immediatly(Apache2::Const::OK);
}
}
, के रूप में अकेले या mod_cgi के नीचे खड़े चल रहा है, है, लेकिन mod_perl
के तहत मैं की जरूरत है: निम्नलिखित मैं क्या हासिल करने की कोशिश कर रहा हूँ का एक उदाहरण है मूल handler
सबराउटिन में कुछ वापस करें। यह मुझे कॉल की पूरी श्रृंखला का ट्रैक रखने के लिए अग्रणी है, जहां तक उन्हें मुख्य handler
पर वापस आने तक कुछ वापस करना होगा।
के बजाय:
unless (check_something()) { ...
मैं जैसे कार्य करने की जरूरत है:
my $check = check_something();
return $check if $check;
और मैं भी मुख्य हैंडलर में कुछ इसी तरह है, जो कुछ के लिए काफी ungly है क्या करना है स्थिति हैंडलिंग्स।
क्या नेस्टेड कॉल के अंदर अनुरोध को बंद करने का कोई तरीका है, जैसा कि मैंने अपने उदाहरण के साथ उदाहरण देने की कोशिश की?
संपादित करें: मैंने पाया कि मैं एक goto LABEL
और जगह है कि बस मुख्य handler
सबरूटीन में पिछले वापसी से पहले लेबल कॉल कर सकते हैं। यह काम करता है, लेकिन अभी भी एक गंदे हैक की तरह लगता है। मुझे उम्मीद है कि एक अच्छा तरीका है।
मैं mod_perl2 पर कोई विशेषज्ञ हूँ लेकिन आम तौर पर यह कुछ आप के लिए अपवाद का उपयोग करेंगे की तरह दिखता है। Do_post_response() के अंदर, 'मरने' का उपयोग करें हमारे पास एक स्थिति है ... "; और इसे' eval' ब्लॉक का उपयोग करके हैंडलर() में पकड़ें या 'Try :: Tiny' जैसे मॉड्यूल का उपयोग करके बेहतर भी करें। कुछ 'अपवाद :: कक्षा' जोड़ें यदि आपको अन्य अनिश्चित विफलताओं के परिणामस्वरूप हो सकता है कि दूसरों से अपने कस्टम अपवादों को अलग करने की आवश्यकता हो। – mbethke