2011-09-27 10 views
8

मैं कह सकता हूं कि मेरा प्रश्न PHP से संबंधित है, लेकिन जो भी मैं अधिक चिंतित हूं, वह स्थिति में प्रोग्रामिंग का उचित तर्क है जहां फ़ंक्शन निष्पादन अनिश्चित काल तक जा सकता है।PHP या किसी और चीज में समय सीमा फ़ंक्शन निष्पादन

कुछ फ़ंक्शन निष्पादित करने के लिए कितना समय लगता है और इस निष्पादन को रोकने और शेष कार्यक्रम के साथ कैसे चलने का उचित तरीका क्या है?

ठीक है, मुझे पता है कि उदाहरण के लिए एक set_time_limit() फ़ंक्शन है जो घातक त्रुटि देता है लेकिन मुझे यह नहीं चाहिए, मैं चाहता हूं कि मेरा कोड x सेकंड के बाद ही जारी रहे, या हो सकता है कि समय समाप्त होने के बाद अपवाद फेंक दिया जाए, इसे पकड़ो और कुछ और करो?

किसी प्रकार का "वॉचडॉग" फ़ंक्शन समाधान लिख रहा है और यह कैसे किया जाता है?

किसी भी मदद के लिए धन्यवाद, कोई भी लिंक, कोई भी लेख जो इस समस्या को इस तरह से संबोधित करता है जिस तरह से "किया जाना चाहिए"।

बीआर, न्यूमैन

+1

संदर्भ क्या है, अधिक विशेष रूप से? मुझे लगता है कि फ़ंक्शन में कुछ प्रकार का लूप होता है। यदि यह सही है, तो मेरा पहला वृत्ति लूप में प्रवेश करने से पहले 'माइक्रोटाइम()' के साथ टाइमस्टैम्प लेना होगा और उसके बाद उस टाइमस्टैम्प की तुलना करें जो प्रत्येक पुनरावृत्ति पर लूप के अंदर उत्पन्न होता है। एक निश्चित मूल्य तक पहुंचने पर, आप अपवाद फेंक सकते हैं, या कुछ और कर सकते हैं। शायद मैंने जो कुछ करने की कोशिश कर रहे हैं उसके संदर्भ में मैंने गलत व्याख्या की है। क्या आप ऐसे कुछ ढूंढ रहे हैं जो आप कई कार्यों के लिए अधिक आसानी से आवेदन कर सकते हैं? – Pete171

+0

हाँ, ऐसा कुछ।मेरी समस्या यह है कि मेरे कार्यों में से एक अन्य डिवाइस पर टेलनेट करने की कोशिश कर रहा है और कभी-कभी टेलनेट टाइमआउट लंबा होता है। – newman555p

उत्तर

3

पीएचपी एक सामान्य तरीके से एक समारोह का समय-समाप्त करने के लिए प्रदान नहीं करता है। लेकिन कई घटक जहां यह समस्या आम है, आप एक टाइमआउट को परिभाषित करने देते हैं।

उदाहरण:

file_get_contents('http://example.com', false, stream_context_create(
    array('http' => array('timeout' => 10 /* seconds */)) 
)); 
  • पीडीओ (डेटाबेस अमूर्त परत) आप PDO::ATTR_TIMEOUT attribute का उपयोग कर एक समय समाप्ति सेट करने के लिए अनुमति देता है (ध्यान दें कि यह है कि:

    • HTTP Stream Wrapper आप एक timeout विकल्प निर्दिष्ट करने के लिए अनुमति देता है विशेषता का मतलब विभिन्न डेटाबेस ड्राइवरों के साथ अलग-अलग चीजों का हो सकता है):

      $pdo->setAttribute(PDO::ATTR_TIMEOUT, 10 /* seconds */); 
      
    • आप जब FTP का उपयोग कर एक कनेक्शन समयबाह्य सेट कर सकते हैं:

      $ftp = ftp_connect('example.com', 21, 10 /* seconds */) 
      

    इसी तरह अन्य सभी एक्सटेंशन है कि संभावित दूरदराज के संसाधनों का उपयोग इस तरह के टाइमआउट मानकों या विकल्पों प्रदान करेगा।

  • 0

    विशेष रूप से PHP में, मुझे नहीं लगता कि आपके पास उनके कार्यों के निष्पादन समय को नियंत्रित करने का एक वैध तरीका है। जैसा आपने कहा था, set_time_limit जैसी चीजें एक फतरर त्रुटि फेंक देंगी और आपकी स्क्रिप्ट को मार देंगी।

    मैं microtime() जैसी चीजों का उपयोग करके अपने कार्यों के भीतर से अपने निष्कर्ष समय को खराब करने का सुझाव दूंगा और समय सीमा समाप्त होने पर अपवाद फेंक दूंगा; एक अपवाद है कि आप बाहर पकड़ने और तदनुसार कार्य जारी रखने में सक्षम होंगे।

    +0

    ठीक है, मैं इसे थै की तरह कोशिश करूंगा। लेकिन इस समस्या को आम तौर पर कैसे संबोधित किया जाता है (PHP नहीं)? – newman555p

    +0

    मुझे लगता है कि यह उस भाषा पर निर्भर करता है जिसका आप उपयोग कर रहे हैं। अर्लंग जैसे कुछ प्रोग्रामर को प्रक्रिया को संलग्न करने की अनुमति देते हैं ताकि वे एक-दूसरे की निगरानी कर सकें। मुझे नहीं पता कि इस परिदृश्य को संभालने के लिए एक मानक तकनीक है, लेकिन यदि वहां है, तो कृपया मुझे नाम जानने के लिए टिप्पणी करें :) – Deleteman