2010-03-04 43 views
12

我有兩個理由使用睡眠功能:首先,在他們與我們聯繫20分鐘後自動發送確認電子郵件給客戶。我不想使用cron作業,因爲我希望它完全是20分鐘(並且我厭倦了我的web服務器向我發送電子郵件,告訴我他們發起了cron作業......每20分鐘發送一封新郵件! )睡眠功能使用服務器資源?

第二個原因:我聽說有人用休眠功能發送羣發電子郵件。由於我的服務器每小時只允許發送100封電子郵件,因此我想使用睡眠功能讓腳本睡眠一個小時,然後繼續它的拾取位置。

我的問題是:它使用服務器資源?它會減慢速度嗎?使用睡眠功能還有其他問題嗎?提前致謝!

回答

13

雖然進程爲sleep ing,但它不會佔用CPU時間,但進程的工作集仍需要物理內存和/或頁面文件來支持該進程。換句話說,PHP解釋器進程需要繼續運行。只要你的服務器有足夠的RAM,這應該不成問題。

+0

因此,如果我的託管服務信譽良好(例如,godaddy),我可能不必擔心內存問題?謝謝你的幫助! – Dustin 2010-03-04 04:55:34

+9

在您的PHP serverside腳本中使用sleep函數並不是一個好主意。你在睡覺時正在浪費一個網絡服務器線程。另外,如果你睡得太久,服務器將會阻止你的進程,或者用戶的瀏覽器超時並放棄。 正確的做法是使用cronjob或獨立進程。 – Vlad 2010-03-04 05:04:27

+4

你也會爲自己的DoS攻擊敞開大門。有些混蛋可能會在一分鐘內註冊幾百個帳號,而睡眠Apache線程會佔用你所有的內存。 – 2010-03-04 05:29:18

8

電子郵件的發送時間很不穩定,所以無論您做什麼,您都不會在20分鐘內收到一封電子郵件給某人的收件箱。

我使用長時間運行的後臺腳本 - 從CLI啓動而不是apache--來處理電子郵件發送。我的應用程序將電子郵件轉儲到隊列表中,郵件程序腳本每15秒輪詢一次。它在輪詢之間睡眠()。這樣,我只有一個腳本試圖連接到SMTP服務器,並正在睡覺。

該部分的應用程序已成功運行,過去2年沒有重大問題。唯一的煩惱就是讓腳本繼續運行 - 如果出於任何原因而停止運行,郵件不會一直出現,直到您恢復爲止。但最糟糕的情況是,您可以定期通過cron重新啓動它,例如日常。

如果我正在處理您的問題,我只需在隊列表中放置一個「發送時間」列,併爲這些電子郵件記錄20分鐘的日期。郵件會然後SELECT * FROM mail_queue WHERE send_time <= NOW()

或者,你可以使用一個真正的jobqueue像beanstalkd。我選擇了隊列表來保持我的應用程序棧簡單。

-1
sleep(); 

是的,睡眠確實使用服務器資源。

是的,它會減慢你在睡眠中的時間(...)。

使用「睡眠」時還有其他問題。

有人在this page

請記住,睡眠()的意思是 「讓PHP時間做一些其他的東西。」 這意味着sleep()可以被信號中斷。如果您使用pcntl_signal()和朋友,這非常重要。

-1

而不是服務器睡眠,即sleep(3);

我用使用Javascript「客戶端」睡眠:

if (empty($_COOKIE['my_Timer'])) {die('<script>window.setTimeout(\'window.location="'.$_SERVER['REQUEST_URI'].'"; \',3000);</script>');} 
setcookie('my_Timer', "blabla", time()+999999, '/'); 
0

知道這是一個非常古老的線程,但有些人可能會遇到,所以這裏是另一個建議。

此,如果只會工作:

  • 您是Linux服務器
  • 可以通過命令上(象exec,一些共享主機不會允許這種)

睡覺,而不是很長一段時間,我認爲這是一個糟糕的做法(對於這種情況),您可能會考慮使用at命令。

雖然cron作業是重複性工作的理想選擇,但如果您只想在未來某個特定時間運行一次命令,那麼at是您最好的朋友。

這就是我要如何在用戶與網頁互動後發送電子郵件X的時間。

例子:

$wait_time=time()+mt_rand(3600,36000); 
//wait a random amount of time between 1 and 10 hours 
//$wait_time=time()+1200 -if you want 20 minutes exactly. 
$cmd_string=escapeshellcmd('php /path/to/script.php '.$par1.' '.$par2.' "'.$par3.'" '.$parX); 
exec("echo -e '$cmd_string' | at ".date("Hi M d",$wait_time)); 

比你創建負責處理所有傳遞的參數,做任何你想做的script.php。