2010-10-14 18 views
43

मैंने अभी sleep() पर दस्तावेज़ों पर एक नज़र डाली थी।PHP की नींद() के लिए व्यावहारिक उपयोग क्या है?

आप इस फ़ंक्शन का उपयोग कहां करेंगे?

क्या सीपीयू को महंगी फ़ंक्शन में ब्रेक देने के लिए है?

कोई आम समस्या है?

उत्तर

43

एक जगह जहां इसका उपयोग होता है वह देरी बनाना है।

आइए कहें कि आपने क्रॉलर बनाने के लिए curl/file_get_contents का उपयोग करने वाले क्रॉलर का निर्माण किया है। अब आप रिमोट सर्वर पर कम समय में बहुत से अनुरोधों के साथ बमबारी नहीं करना चाहते हैं। तो आप लगातार अनुरोधों के बीच देरी शुरू करते हैं।

sleep सेकंड में तर्क लेता है, इसका मित्र usleep माइक्रोसॉन्ड में तर्क लेता है और कुछ मामलों में अधिक उपयुक्त है।

+1

एकमात्र चीज जो मैं सोच सकता था, जब तक कोई वेबसर्वर पर अन्य चीज़ों के लिए PHP का उपयोग नहीं कर रहा हो। – Frank

+3

अधिक आम तौर पर: * आवक और आउटगोइंग दोनों अनुरोध * थ्रॉटलिंग *। – deceze

+0

यह सुनिश्चित करने के लिए कि फ़ाइलों को पूरी तरह से अपलोड किया गया है, सर्वर पर फ़ाइल अपलोड करने के बाद मैं 'नींद' का उपयोग करता हूं। इसके बिना लिपि असफल हो जाएगी। – VSG24

22

यहाँ कैसे मैं अपनी परियोजनाओं में से एक में sleep का उपयोग का एक टुकड़ा है:

foreach($addresses as $address) 
{ 
    $url = "http://maps.google.com/maps/geo?q={$address}&output=json...etc..."; 
    $result = file_get_contents($url); 
    $geo = json_decode($result, TRUE); 

    // Do stuff with $geo 

    sleep(1); 
} 

इस मामले sleep में मुझे रोकने गूगल के नक्शे से अवरुद्ध किया जा रहा है, क्योंकि मैं सर्वर से बहुत अधिक अनुरोध भेज रहा हूँ मदद करता है।

संपादित करें: यह एक उदाहरण है जो कोडोडिक्ट कह रहा है।

1

आप स्क्रिप्ट निष्पादन को रोकने के लिए नींद का उपयोग कर सकते हैं ... उदाहरण के लिए देरी करने के लिए AJAX सर्वर पक्ष द्वारा कॉल करें या पर्यवेक्षक को लागू करें। आप देरी अनुकरण करने के लिए इसका भी उपयोग कर सकते हैं।

मैं प्रेषक() & सह देरी करने के लिए भी इसका उपयोग करता हूं। ।

कोई भी डीओएस को रोकने और ब्रूटफोक लॉगिन करने के लिए उपयोग नींद() का उपयोग करता है, मैं इस बात से सहमत नहीं हूं कि इस कारण से उपयोगकर्ता को कई बार चलाने से रोकने के लिए कुछ चेक जोड़ने की आवश्यकता है।

usleep भी देखें।

25

एक और उदाहरण: आप किसी प्रकार की बैच प्रक्रिया चला रहे हैं जो संसाधन का भारी उपयोग करता है। हो सकता है कि आप 9, 000,000 पुस्तक शीर्षक के डेटाबेस चल रहे हों और उनमें से लगभग 10% अपडेट कर रहे हों। उस प्रक्रिया को दिन के मध्य में चलाना पड़ता है, लेकिन ऐसा करने के लिए बहुत सारे अपडेट हैं जो आपके बैच प्रोग्राम को चलाने से डेटाबेस सर्वर को अन्य उपयोगकर्ताओं के लिए क्रॉल में डाल दिया जाता है।

तो आप डेटाबेस सर्वर को बैक अप लेने वाले अन्य उपयोगकर्ताओं से किसी भी अनुरोध को संसाधित करने का मौका देने के लिए 5 सेकंड के लिए 1000 अपडेट, फिर sleep सबमिट करने के लिए बैच प्रक्रिया को संशोधित करते हैं।

1

मुझे हाल ही में इसका उपयोग करना पड़ा जब मैं Google की जिओलोकेशन एपीआई का उपयोग कर रहा था। लूप में प्रत्येक पते को Google के सर्वर को कॉल करने की आवश्यकता होती है, इसलिए प्रतिक्रिया प्राप्त करने में थोड़ा सा समय चाहिए। मैंने पर्याप्त समय शामिल सब कुछ देने के लिए usleep(500000) का उपयोग किया।

1

मैं आमतौर पर वेब पृष्ठों की सेवा के लिए इसका उपयोग नहीं करता, लेकिन यह कमांड लाइन स्क्रिप्ट के लिए उपयोगी है।

$ready = false; 
do { 
    $ready = some_monitor_function(); 
    sleep(2); 
} while (!$ready); 
1

सुपर पुरानी पोस्ट, लेकिन मैंने सोचा कि मैं भी टिप्पणी करूंगा। मुझे हाल ही में एक बहुत लंबी चल रही प्रक्रिया की जांच करनी पड़ी जिसने कुछ फाइलें बनाईं। इसलिए मैंने एक ऐसा फ़ंक्शन बनाया जो एक कर्ल फ़ंक्शन पर पुनरावृत्त करता है। यदि फ़ाइल मैं तलाश कर रहा हूँ मौजूद नहीं है, मैं php फ़ाइल नींद आती है और कुछ देर में पुनः जाँच:

function remoteFileExists() { 
    $curl = curl_init('domain.com/file.ext'); 

    //don't fetch the actual page, you only want to check the connection is ok 
    curl_setopt($curl, CURLOPT_NOBODY, true); 

    //do request 
    $result = curl_exec($curl); 

    //if request did not fail 
    if ($result !== false) { 
     //if request was ok, check response code 
     $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); 

     if ($statusCode == 404) { 
       sleep(7); 
       remoteFileExists(); 
     } 
     else{ 
      echo 'exists'; 
     } 
    } 

    curl_close($curl); 

} 

echo remoteFileExists(); 
6

पुराना सवाल मुझे पता है, लेकिन यू प्रयोग करने के लिए एक और कारण है/नींद जब तुम हो सकता है एक प्रमाणीकरण स्क्रिप्ट जैसे सुरक्षा/क्रिप्टोग्राफी कोड लिख रहे हैं। उदाहरण के एक जोड़े:

  1. आप अपने लॉगिन स्क्रिप्ट उद्देश्यपूर्ण धीमी करके एक संभावित ब्रूट फोर्स हमले के प्रभाव को कम करने के लिए, विशेष रूप से के बाद कुछ ही प्रयास विफल कर सकते हैं।
  2. इसके अलावा आप एन्क्रिप्शन के दौरान timing attacks के खिलाफ कम करने के लिए कृत्रिम देरी जोड़ना चाहेंगे। मुझे पता है कि संभावनाएं पतली हैं कि आप PHP जैसे भाषा में ऐसे गहन एन्क्रिप्शन कोड लिखने जा रहे हैं, लेकिन फिर भी मान्य मानते हैं।
+0

सर्वश्रेष्ठ उत्तर IMHO – Julian

0

इसका एक आवेदन है, यदि मैं 100+ ग्राहकों को एक स्क्रिप्ट द्वारा मेल भेज रहा हूं तो इस ऑपरेशन में अधिकतम 1-2 सेकंड लगेंगे, इस प्रकार हॉटमेल और याहू जैसी अधिकांश वेबसाइट इसे स्पैम के रूप में मानती है, इसलिए इससे बचें हमें हर मेल के बाद निष्पादन में कुछ देरी का उपयोग करने की आवश्यकता है।

0
दूसरों के बीच में

: यदि आप एक वेब अनुप्रयोग है कि ayncronous अनुरोध करता (AJAX कॉल, आलसी छवि लोड, ...)

आप इसे परीक्षण कर रहे हैं स्थानीय स्तर पर तो प्रतिक्रियाओं तत्काल हैं, क्योंकि एक ही उपयोगकर्ता है (परीक्षण कर रहे हैं आप) और कोई नेटवर्क विलंबता नहीं है।

sleep का उपयोग करके आप देख सकते हैं कि परीक्षण और नेटवर्क कारण अनुरोधों में देरी के दौरान वेब ऐप कैसे व्यवहार करता है।

0

एक त्वरित छद्म कोड उदाहरण जहां आप एक ईवेंट के लिए लाखों चेतावनी ईमेल नहीं प्राप्त करना चाहते हैं, लेकिन आप अपनी स्क्रिप्ट को चलाना चाहते हैं।

if CheckSystemCPU() > 95 
     SendMeAnEmail() 
     sleep(1800) 
    fi 
+1

PHP सिंटैक्स वास्तव में हाल ही में बदल गया है ...: पी – alex

+0

एलओएल मुझे पता था कि कोई कुछ कहने जा रहा था :-) हा हा –

-1

इसका उपयोग करने का एक और तरीका: यदि आप हर मिनट एक cronjob निष्पादित करना चाहते हैं। मैं इस के लिए निम्न कोड का उपयोग करें:

sleep(30); 
include 'cronjob.php'; 

मैं इस फ़ाइल कहते हैं, और हर मिनट cronjob.php।

0

यह एक अजीब मामला है ... फ़ाइल स्थानांतरण थ्रॉटलिंग।

एक फ़ाइल स्थानांतरण सेवा में हमने बहुत समय पहले भाग लिया था, फ़ाइलों को 10 एमबीपीएस अपलिंक सर्वर से परोसा गया था। नेटवर्क को दबाने से रोकने के लिए, डाउनलोड स्क्रिप्ट ने ट्रैक किया कि कितने उपयोगकर्ता एक बार में डाउनलोड कर रहे थे, और उसके बाद गणना की गई कि प्रति उपयोगकर्ता प्रति सेकंड कितने बाइट्स भेज सकते हैं। यह इस राशि का हिस्सा भेज देगा, फिर एक पल सोएगा (1/4 दूसरा, मुझे लगता है) तो और भेजें ... आदि।

इस तरह, सर्वर लगातार 9.5 एमबीपीएस पर चलते थे, संतृप्ति के मुद्दों को अपलिंक किए बिना ... और हमेशा डाउनलोड की गति को गतिशील रूप से समायोजित करते थे।

मैं इसे इस तरह से या PHP में नहीं करूँगा ... लेकिन यह उस समय बहुत अच्छा काम करता था।

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