2011-08-23 124 views
2

我有一個Web應用程序,用戶可以在其中創建主題並評論其他主題(類似於我們在此處的stackoverflow)。我希望能夠向參與討論的用戶發送通知。實現電子郵件通知

我知道最簡單的方法是將通知掛接到用戶與討論交互時執行的腳本。儘管這似乎很容易,但我認爲它不是最合適的方式,因爲用戶需要等到所有電子郵件通知(通知腳本結束執行)纔會被髮送,直到他獲得他的行動狀態。

我知道的另一種方法是使用cronjob來安排通知腳本的執行。爲了使通知相關,腳本將按照每3到7分鐘執行一次,以確保用戶在合理的時間內收到通知。

現在我關心的是,將設置cronjob每3分鐘運行一次腳本消耗合理的系統資源考慮到我的應用程序仍在共享主機平臺上運行?

另外,我在考慮是否有可能通過評論腳本觸發或通知通知腳本將通知發送到指定的電子郵件地址,而評論腳本繼續執行而不必等待完成通知腳本。如果這可以實現,那麼我認爲這將是我的最佳選擇。

非常感謝您的時間。

回答

0

除非您的通知腳本耗費大量資源,並且在每次運行時發送數十條或數百條消息,否則我不會擔心在共享主機上每3-7分鐘就會調度一次。事實上,如果您預定了3分鐘,並發現網站性能下降,那麼將其提高到4分鐘,資源減少25%。雖然這不太可能是個問題。

就開始後臺進程而言,您可以通過系統調用exec()來實現該功能。我會直接給你this question一個很好的答案。

0

IMO爲每個「討論交互」添加一個「鉤子」是迄今爲止最乾淨的方法,避免讓用戶等待的一個技巧是在HTTP響應中發回Content-Length頭。運行良好的HTTP客戶端應該讀取指定數量的八位字節,然後關閉連接,因此如果您使用適當的Content-Length HTTP標頭(並設置了ignore_user_abort)發回「狀態」響應,那麼最終用戶將不會請注意,您的服務器端腳本實際上會繼續其快樂的方式,在退出之前生成電子郵件通知(可能甚至持續幾分鐘)。

0

我不確定我是否同意這種方法,即在提供請求的同一個進程中發送電子郵件是一種方法。一般來說,最好簡單一些;儘快提供請求並讓後臺進程盡一切努力。當流量增加並且您的服務器變得忙碌時,這種方法會使等待時間縮短,用戶更快樂。它也將幫助分離您的疑慮,這將有助於您稍後修復錯誤和重構。

就我個人而言,我會創建一個在後臺定期運行的腳本,並檢查所有線程是否有新的活動。如果線程有新的活動,那麼腳本可以發送通知電子郵件給所有參與者。這將您發送電子郵件的邏輯與用於服務請求的邏輯分開,並將它們物理分隔 - 例如,如果您的SMTP服務器突然開始花費很長時間來響應,它將不會對您的請求響應時間產生影響。另外,如果在高峯期你的服務器太忙,你可以停止運行這個腳本,讓服務器專注於服務請求。

爲了運行此腳本,您當然可以使用CRON,並按照建議將其設置爲每4分鐘運行一次。但是,如果腳本耗時超過4分鐘,該怎麼辦?您最終可能會同時運行兩個腳本,這可能導致向某些用戶發送兩次相同的電子郵件。一個解決方案是使用胖控制器,它是我在C中編寫的一個守護進程,它可以定期運行任何腳本(PHP,Python,任何東西) - 它基本上是任何東西的守護進程。最重要的是,它可以在前一個實例結束x秒後運行一個新實例,因此您不必擔心多個實例。

胖控制器是非常可配置的,可以在各種模式下運行,甚至可以處理多個並行進程。你可以閱讀更多關於它和網站上的一些使用案例:

http://www.4pmp.com/fatcontroller/