2013-02-13 161 views
1

我有一個PHP網站,用戶可以安排消息發送。我可以發送消息,類似命令這一個:幾小時後PHP運行腳本

php sendMsg.php 249 

其中數字是消息

很多人建議使用cron作業的ID,但因爲我不想在區間cron運行此是沒有選擇的(只有一次 - 例如3小時後)。 我的想法如下:

$seconds = $hours*60*60; 
exec('sleep '.$seconds.'; php sendMsg.php 249'); 

但是這不會工作,因爲它會阻止PHP的進一步執行。達到此目的最簡單的方法是什麼?

+0

你舒爾它塊完整的PHP?因爲每個執行php cli應該導致一個自己的線程? – Dukeatcoding 2013-02-13 16:10:43

+0

你爲什麼把睡眠放在'exec'中? – 2013-02-13 16:10:54

+0

順便說一句。我們在談論什麼樣的信息 – Dukeatcoding 2013-02-13 16:11:26

回答

-1

忽略的cron的建議,如果你想簡單地等待一段時間再使用at調度:

$hours = 2; 
$command = sprintf('echo "php sendMsg.php 249" | at now + %d hours', $hours); 
exec($command); 
1

將時間表放到數據庫中。每分鐘運行一次cronjob,檢查數據庫是否應該在這一分鐘內發送消息,然後發送。

0

有沒有你不想使用cron工作的原因?這將是發送消息的最簡單和最有效的方式。

+0

這不是一個答案;你應該評論這個問題... – 2013-02-13 16:33:27

+0

我不同意。答案很清楚地表明,cron作業將是發送消息的最簡單和最有效的方式。 – premisoft 2013-02-13 16:37:49

+0

我的意思是:你要求作者澄清他爲什麼放棄使用cron作業。使用cron作業對作者來說不是一個新的解決方案,因爲他明確地告訴他不想使用它,並且我們不知道是否有很好的理由。當他告訴我們他的理由時,您可以就此進行辯論... – 2013-02-13 16:49:45

0

我認爲一個cronjob IST仍然以正確的方式

  1. 創建一個表,其中要發送的郵件存儲,使用時的時間戳是發送和isSend
  2. 創建一個標誌的cronjob - 開始PHP skript每1分鐘,這與時間戳<當前時間和isSend =假
1

你說你不想使用cron作業,因爲你只需要發送一次的消息,但這些消息發送這是誤解t的方式將爲此類任務編寫一個cron作業

考慮一種情況,即您有許多用戶創建許多要在各個給定時間點發送的消息。

您不希望有一個PHP程序坐在您的服務器上,隨時爲您的服務器上的每個消息;這會浪費服務器資源,即使它們在整個過程中都只是sleep()

相反,人們會使用cron作業每分鐘運行一次短暫的PHP程序(或任何適合您的間隔)。

您的消息創建程序不會被寫入以便發送消息;相反,它會將它插入到數據庫中,以及它需要發送的時間。

同時,cronjob PHP程序會每分鐘掃描一次該數據庫,看看是否有任何消息是由於發送而尚未發送的。然後它會發送這些消息並將它們標記爲「發送」在數據庫上。

這是寫這種東西的標準方式,所以人們向你推薦它並不奇怪。

這樣做意味着你永遠不會有在你的系統上運行的程序超過必要的時間。這兩個PHP程序都快速完成工作並退出,這意味着沒有人會一直等待它們。

它也使它更加健壯。想象一下,如果你的服務器必須重新啓動。如果你有一大堆PHP程序運行幾個小時,等待他們發​​送消息,那麼他們都會丟失。另一方面,如果他們已將消息保存到數據庫中,那麼cron作業將找到它們並在服務器重新啓動後正確發送它們。