2010-10-14 39 views

回答

43

它找到用途的一個地方是創建一個延遲

比方說,你已經構建了一個履帶,使用curl/file_get_contents來獲取遠程頁面。現在,您不想在短時間內以太多的請求轟炸遠程服務器。所以你在連續的請求之間引入一個延遲。

sleep在幾秒鐘內取得參數,其朋友usleep以微秒爲參數,在某些情況下更適合。

+1

我唯一能想到的就是,除非在網絡服務器上使用php來做其他事情。 – Frank 2010-10-14 06:56:27

+3

更一般地說:*請求限制*,包括傳入和傳出。 – deceze 2010-10-14 06:57:42

+0

上傳文件到服務器後,我使用'sleep'來確保文件完全上傳。沒有它,腳本就會失敗。 – VSG24 2016-09-22 22:35:53

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幫助我避免被攔截的谷歌地圖,因爲我發送太多的請求到服務器。

編輯:這是codaddict在說什麼的例子。

1

您可以使用sleep來暫停腳本執行...例如延遲服務器端的AJAX調用或實現觀察者。您也可以使用它來模擬延遲。

我使用它也延遲sendmail()& co。 。

有人使用sleep()來防止DoS和登錄brutefoces,我不同意'因爲你需要添加一些檢查來防止用戶多次運行。

還請檢查usleep

25

另一個示例:您正在運行某種批量過程,該過程大量使用資源。也許你正在走900萬本書名的數據庫,並更新其中約10%的書目。這個過程必須在一天中間運行,但是有很多更新需要完成,以至於運行批處理程序會拖動數據庫服務器以抓取其他用戶。

因此,您修改批處理過程以提交1000次更新,然後sleep 5秒鐘,以使數據庫服務器有機會完成處理已備份的其他用戶的任何請求。

1

我最近在使用Google的Geolocation API時不得不使用它。每個循環中的地址都需要調用Google的服務器,因此需要一點時間才能收到響應。我使用usleep(500000)爲所有涉及的時間足夠。

1

我通常不會使用它來提供網頁,但它對命令行腳本很有用。

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

超級老帖子,但我想我也會評論。 我最近必須檢查一個非常長的運行過程,它創建了一些文件。所以我做了一個遍歷cURL函數的函數。如果我要找的文件不存在,我睡的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

老問題,我知道,但另一個原因是使用U /睡眠,可當你正在編寫安全/加密代碼,如驗證腳本。幾個示例:

  1. 您可能希望通過有目的地減緩登錄腳本,特別是在幾次失敗嘗試後降低潛在的強力攻擊的有效性。
  2. 此外,您可能還希望在加密過程中添加人爲延遲以減輕對timing attacks的影響。我知道你會用像PHP這樣的語言編寫如此深入的加密代碼的機會很渺茫,但我認爲仍然有效。
+0

最佳答案恕我直言 – Julian 2014-03-20 14:14:50

0

它的一個應用是,如果我通過腳本向100多個客戶發送郵件,那麼這個操作最多需要1到2秒鐘的時間,因此像hotmail和yahoo這樣的大多數網站都認爲它是垃圾郵件,所以避免這種情況,我們需要在每封郵件後執行一些延遲。

0

在別人:你正在測試一個Web應用程序,使ayncronous請求(AJAX調用,懶圖像加載,...)

你是在本地測試它,以便反應是直接由於只有一個用戶(你)並且沒有網絡延遲。

使用sleep可讓您查看/測試負載和網絡導致請求延遲時Web應用程序的行爲。

0

一個快速僞代碼示例,您可能不想爲單個事件獲取數百萬條警報電子郵件,但希望腳本繼續運行。

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

PHP語法最近真的發生了變化......:P – alex 2016-11-22 08:04:44

+0

LOL我知道有人會說些什麼:-)哈哈 – 2016-11-22 20:30:04

-1

另一種使用方法:如果你想在每分鐘更頻繁地執行一次cronjob。我使用下面的代碼:

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

我把這個文件和cronjob.php每分鐘調用一次。

0

這有點奇怪......文件傳輸調節。

在我們很久以前運行的文件傳輸服務中,文件是從10Mbps上行鏈路服務器提供的。爲了防止網絡陷入停滯,下載腳本會跟蹤有多少用戶同時下載,然後計算每個用戶每秒可以發送多少字節。它會發送這個數額的一部分,然後睡一會兒(我認爲是1/4秒)然後發送更多...等等。

通過這種方式,服務器以9.5Mbps的速度連續運行,沒有上行鏈路飽和問題......並且總是動態地調整下載速度。

我不會這樣做,或者在PHP中,現在...但它在當時效果很好。

相關問題