2012-06-12 19 views
7

मैं वेब पेजों से सामग्री डाउनलोड करने के लिए एलडब्लूपी का उपयोग कर रहा हूं, और मैं उस पृष्ठ की प्रतीक्षा करने की मात्रा को सीमित करना चाहता हूं। यह इस तरह LWP में पूरा किया है:प्रभावी ढंग से lwp टाइमआउट को संभालें

my $ua = LWP::UserAgent->new; 
$ua->timeout(10); 
$ua->get($url); 

और यह ठीक काम करता है, जब भी समय समाप्त अपनी सीमा तक पहुँच जाता है, यह सिर्फ मर जाता है और मैं स्क्रिप्ट के साथ पर जारी नहीं रख सकते के अलावा! मैं वास्तव में इस टाइमआउट को सही तरीके से संभालना चाहता हूं ताकि मैं रिकॉर्ड कर सकूं कि यूआरएल में टाइमआउट था और फिर मेरे अगले पर चले गए। क्या किसी को भी यह करना आता है? धन्यवाद!

उत्तर

13

LWP::Agent के get() एक HTTP::Response उद्देश्य यह है कि आप की जाँच त्रुटियों के लिए उपयोग कर सकते हैं देता है:

use LWP::Agent; 
use HTTP::Status(); 

my $ua = LWP::UserAgent->new; 
$ua->timeout(10); 
my $response = $ua->get($url); 

if ($response->is_error) { 
    printf "[%d] %s\n", $response->code, $response->message; 

    # record the timeout 
    if ($response->code == HTTP::Status::HTTP_REQUEST_TIMEOUT) { 
     ... 
    } 
} 

बीटीडब्ल्यू, आज बेहतर अभ्यास के बजाय Try::Tiny का उपयोग करना है। यह आपको try {...} catch {...} देता है। और यह if [email protected] की जांच के साथ कुछ समस्याएं हल करता है (Try::Tiny दस्तावेज़ में पृष्ठभूमि अनुभाग देखें)।

+0

बहुत बहुत धन्यवाद! यह वास्तव में उपयोगी है। मैंने इसका परीक्षण किया हालांकि और कुछ कारणों से जब भी टाइमआउट होता है तो यह कथन के दूसरे भाग में नहीं आता है। "रीड टाइमआउट" $ प्रतिक्रिया-> संदेश के अंदर क्या है। क्या आपको पता है कि यह दूसरे कथन के लिए सच क्यों नहीं है? – srchulo

+0

निश्चित रूप से पता नहीं है। क्या आपने HTTP :: स्थिति' का उपयोग किया था? '$ प्रतिक्रिया-> संदेश' और' $ प्रतिक्रिया-> कोड' के वास्तविक मान क्या हैं? क्या यह वास्तविक टाइमआउट (कोड 408) है? – stevenl

+0

मैंने कोड का उपयोग ठीक उसी तरह किया था जैसा कि यह "HTTP :: स्थिति :: HTTP_REQUEST_TIMEOUT" से ऊपर है। $ प्रतिक्रिया-> संदेश "रीड टाइमआउट" और $ प्रतिक्रिया-> कोड "500" रखता है। – srchulo

1

आप eval ब्लॉकों का उपयोग कर एक कोशिश {} {} पकड़ पर्ल में के बराबर कर सकते हैं:

http://perldoc.perl.org/functions/eval.html

+0

धन्यवाद। जैसा कि मैं उम्मीद कर रहा था उतना सुरुचिपूर्ण नहीं, लेकिन मैं इसका उपयोग कर समाप्त हुआ। – srchulo

1

अधिकांश उद्देश्यों के लिए, एलडब्लूपी :: उपयोगकर्ता एजेन्ट का टाइमआउट पर्याप्त है, लेकिन इसमें कुछ कमियां आती हैं ... यह प्रत्येक सिस्टम कॉल पर कुल योग की बजाय लागू होती है। यदि आपको वास्तव में एक निश्चित टाइमआउट अवधि की आवश्यकता है, तो यह उन चीजों में से एक है जो LWPx::ParanoidAgent परवाह करते हैं।

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