2016-08-29 8 views
14

के तहत बंद प्रतिक्रिया मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या मुख्य हैंडलर पर लौटने के बिना 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 सबरूटीन में पिछले वापसी से पहले लेबल कॉल कर सकते हैं। यह काम करता है, लेकिन अभी भी एक गंदे हैक की तरह लगता है। मुझे उम्मीद है कि एक अच्छा तरीका है।

+2

मैं mod_perl2 पर कोई विशेषज्ञ हूँ लेकिन आम तौर पर यह कुछ आप के लिए अपवाद का उपयोग करेंगे की तरह दिखता है। Do_post_response() के अंदर, 'मरने' का उपयोग करें हमारे पास एक स्थिति है ... "; और इसे' eval' ब्लॉक का उपयोग करके हैंडलर() में पकड़ें या 'Try :: Tiny' जैसे मॉड्यूल का उपयोग करके बेहतर भी करें। कुछ 'अपवाद :: कक्षा' जोड़ें यदि आपको अन्य अनिश्चित विफलताओं के परिणामस्वरूप हो सकता है कि दूसरों से अपने कस्टम अपवादों को अलग करने की आवश्यकता हो। – mbethke

उत्तर

2

मुझे लगता है कि आप अभी भी बाहर निकलें() कॉल करने के लिए ठीक हैं क्योंकि मोड-पर्ल ओवरराइड क्या बाहर निकलने करता है:

बाहर निकलने

सामान्य पर्ल कोड बाहर निकलने में() प्रयोग किया जाता है कार्यक्रम प्रवाह को रोकने के लिए और पर्ल दुभाषिया से बाहर निकलें। हालांकि mod_perl के तहत हम केवल पर्ल दुभाषिया को मारने के बिना प्रोग्राम प्रवाह को रोकना चाहते हैं।

यदि आपके कोड में बाहर निकलने() कॉल शामिल हैं और इनका उपयोग जारी रखना ठीक है तो आपको कोई कार्रवाई नहीं करनी चाहिए। mod_perl चिंताएं अपने स्वयं के संस्करण के साथ बाहर निकलने के लिए() फ़ंक्शन को ओवरराइड करती हैं जो प्रोग्राम प्रवाह को रोकती है, और सभी आवश्यक क्लीनअप निष्पादित करती है, लेकिन सर्वर को मार नहीं देती है। यह ओवरराइडिंग द्वारा किया जाता है:

* कोर :: ग्लोबल :: निकास = \ & ModPerl :: उपयोग :: बाहर निकलें;

https://perl.apache.org/docs/2.0/user/coding/coding.html

+0

मैंने इस प्रश्न पूछने से पहले बाहर निकलने की कोशिश की। यह काम नहीं करता है, यह हैंडलर को वापस लौटने की ज़रूरत नहीं देता है, यह मरने के समान है। –

+0

फिर आपके कोड में एक और समस्या है या आपका mod_perl संशोधित किया गया है। mod_perl बाहर निकलने वाले दस्तावेज़ों में समझाया गया है, जैसा बाहर निकलता है। –

+0

हां, यह बाहर निकलता है, क्योंकि आप लगातार दुभाषिया में हैं और आप वास्तव में बाहर निकलना नहीं चाहते हैं।यदि आप वास्तविक निकास का उपयोग करते हैं, तो आप वास्तव में अपाचे थ्रेड को मार देते हैं। हालांकि, तथ्य यह है कि यह निकास को ओवरराइड करता है, केवल वर्तमान फ़ंक्शन कॉल को समाप्त करता है, लेकिन यह अपाचे में कुछ भी वापस नहीं करता है, और यह समस्या है, अपाचे को वास्तविक प्रतिक्रिया की आवश्यकता है या यह अनुरोध में विफलता के रूप में लेता है। –

संबंधित मुद्दे