2010-07-28 222 views
0

我有一個令人沮喪的問題。我的網絡服務有一個電子郵件到php模塊。簡而言之,一旦我的用戶向他的專用電子郵件地址發送電子郵件,我的郵件服務器就會捕獲該電子郵件,並將其管理到我的服務器上運行的PHP腳本。這個PHP腳本打開一個MySQL連接並將電子郵件內容保存到數據庫中。MySQL連接限制和PHP MySQL連接

到目前爲止這麼好。一旦超過了/etc/my.cnf中設置的MySQL連接限制,問題就會發生。它被設置爲500.如果500個或更多的用戶同時發送電子郵件,我的MySQL無法處理新的連接。

你有什麼建議?我應該使用持續的MySQL連接還是其他任何方法,如將收到的電子郵件內容寫入txt文件,然後使用cron作業將它們保存到數據庫中?

感謝您的建議!

回答

0

另一個建議是像守護進程一樣運行PHP腳本,它只連接到DB一次,並等待輸入在無限循環中處理。

+0

是的,這似乎是一個好主意,PHP腳本將從管道獲取電子郵件,保存到一個txt文件和守護進程PHP腳本將監視「拾取」目錄並使用單一連接將數據保存到數據庫。謝謝。 – TamTam 2010-07-29 19:12:26

0

爲什麼不提高連接限制,以您所期望的併發用戶數量?

OR

有輕微的延遲或重試周期,其中它會嘗試,如果失敗再次連接。

+1

我認爲你的第二個建議可能是最好的 - 創建一個存儲數據的PHP對象隊列。每隔一段時間,檢查隊列並嘗試將其寫入數據庫。如果失敗,請將其放回隊列中。 – 2010-07-28 00:10:52

+0

托馬斯,這些PHP對象將被存儲在哪裏?如果PHP腳本每次打開數據庫連接,我猜它會在每次嘗試後都會死掉 - 所以隊列只能在郵件服務器端使用。 – Qwerty 2010-07-28 00:15:38

1

我在我運行的網站上有類似的功能。不要將電子郵件輸送到腳本,而是在給定時間無法控制將交付多少封電子郵件的情況下,設置一個cron。這個cron可以按你喜歡的頻率運行。它可以連接到郵件服務器,讀取儘可能多的郵件,並保持與MySQL的單一連接。

這也將大大有助於你遇到郵件轟炸事件。

+0

感謝您的建議,但我們一次收到超過10,000封電子郵件,因此pop3效率不高。直接管道到PHP腳本對我們來說更加可行。 – TamTam 2010-07-29 19:11:27

+0

我不認爲我提到過pop3,我也不認爲你做過。無論哪種方式,cron都可以處理儘可能多的郵件,並根據需要頻繁運行。你甚至可以看中並實現類似Gearman的東西來並行化郵件處理,同時仍然可以控制這些進程佔用多少資源。 – 2010-07-30 00:48:12

1

如果500個或多個用戶在同一時間

嗯發送電子郵件。在計算機系統上「同時」發生兩個事件是非常不尋常的,但頻繁發生的過程會重疊。我希望你能在優化電子郵件處理程序方面獲得很多里程碑。但是你沒有提供如何工作的細節。你不是說這是運行的操作系統。

我建議你檢查是否沒有過度使用CPU或內存的跡象(注意你希望免費使用大約80%的內存)。如果處理程序爲每條消息啓動一個PHP實例,那麼這是一個主要開銷 - 但這不會影響mysql連接打開的時間。

如果您可以避免它,請不要使用Blobs/Clobs - 將數據轉儲到磁盤文件並從數據庫中引用它。

應用所有常用的性能調整步驟(優化物理存儲層 - 例如RAID,數據庫調整)。

整理腳本運行的所有數據庫交互,並在一個塊中運行它們,並使用db連接和關閉語句括起來。

如果你不能同步處理音量,那麼... 不要重新發明輪子,不要實現自己的排隊系統來處理消息 - 直接將消息發送到maildir或郵箱並運行守護進程輪詢內容並處理它。現成的MDAs比使用PHP更有效率。

C.