2010-04-25 41 views
1

請原諒我的這個noob問題,但有沒有這樣的設置可以設置一定的時間(例如毫秒),這些時間必須在發送電子郵件之間通過一個腳本?這個設置是如何調用的?我在哪裏更改該設置?在循環中發送電子郵件時設置的時間量

我舉個例子: 我曾經有發送電子郵件,像這樣一個PHP腳本:

for ($i=0; $i<count($emails); $i++) { 
    mail($email[$i],'test','test'); 
} 

原來並不是因爲劇本跑這麼快的所有電子郵件成功發送,有在發送服務器所需的電子郵件之間沒有足夠的時間。

我有道理嗎?

回答

4

您可以使用這些功能之一一會兒什麼也不做

  • sleep():延誤秒定數的程序執行。
  • usleep():延遲給定數量的微秒的程序執行。


把它們放在循環中應該有所幫助。
例如:

for ($i=0; $i<count($emails); $i++) { 
    mail($email[$i],'test','test'); 
    usleep(100*1000); // 100 milli-seconds 
} 
+0

多少毫秒/秒應該足夠? 我不想將睡眠設置得太高,以至於我的腳本執行時間會超過max_execution時間:) – Obay 2010-04-25 12:21:52

+1

如果我沒有記錯的話,至少在Linux上,'max_execution_time'會計算PHP工作的時間*;當* sleep *時,PHP不*工作*,'sleep()'或'usleep()'花費的時間不應該包含在'max_execution_time'限制中;;;在你的情況下應該使用多少時間?那麼,你將不得不嘗試一些值,爲你的服務器找到合適的值;-) *(在所有情況下沒有任何價值,我會說)* – 2010-04-25 12:25:05

+0

哦,太棒了!我只需要發送大約200封電子郵件。我認爲這不會超過時間限制。謝啦! – Obay 2010-04-25 12:30:50

1

這個腳本是未經測試,但理論上是合理的。在每次發送郵件時,請檢查延遲順序以查看郵件是否已發送。我設定了一個限制來確保腳本不會失敗 - 在打印時,執行時間不應該成爲問題。

for ($i=0; $i<count($emails); $i++) { 
    $sent = mail($email[$i],'test','test'); 
    $count = 0; 

    while($sent == false) { 
    usleep(500); // half a second - test this number until the minimum is found 
    $count++; 

    if($count == 1000) { 
     echo "Email to " . $email[$i] . " failed due to timeout</br>"; 
     break; 
    } 
    } 
} 

確實有幫助嗎?

+0

太棒了! :)但應該usleep()睡覺(0.5)?另外,不應該在while()中再次調用mail()? – Obay 2010-04-25 12:38:24

+0

顯然,如果你想準確的代碼!哈。我不好,我正在考慮動作和毫秒睡眠(500000)或睡眠(.5)兩種方式。而且我不想把郵件()放在一邊,因爲只有在確保先前發送的電子郵件已經發送到「正確的時候,纔會發送到下一個郵件」,因此如果需要,延遲時間超過半秒。這個小小的計數器和if語句只是一個小小的辯護,以確保腳本不會無休止地循環。有效地是僞造的「發送電子郵件...我完成了嗎?我完成了嗎?我完成了嗎?我做了...正確的下一個!」 – Glycerine 2010-04-25 13:00:22

+0

謝謝!即使郵件()還沒有真正完成,我也不知道這個腳本是否可以繼續,這就是爲什麼我認爲郵件()應該再次被放置的時候。很好的腳本:)謝謝 – Obay 2010-04-25 14:10:06

相關問題