2011-02-18 121 views
1

我有一個PHP應用程序,目前有5k用戶,並將繼續增加爲可預見的未來。每週一次我運行一個腳本:我應該使用消息隊列嗎?

  • 通過用戶獲取所有用戶數據庫
  • 循環,並執行每一個一定的維修費用(包括添加新的數據庫記錄)

該腳本最後一次運行時,由於30秒的最大執行時間錯誤,它只會在死前處理1400個用戶。我想到的一個解決方案是使主腳本仍然獲取所有用戶,但不是自己執行維護過程,而是爲一個新的腳本進行一次異步cURL調用(每個用戶1個),以執行維護特定用戶。

我的問題在於,5k + cURL調用可能會導致服務器關閉。這是可以通過使用消息隊列而不是cURL調用來解決的嗎?我沒有使用過的經驗,但從我讀過的內容看來,這可能會有所幫助。如果是這樣,你會推薦哪個消息隊列系統?

一些背景資料:

  • 這是一個Symfony的項目,使用Doctrine作爲我ORM和MySQL作爲我的數據庫
  • 服務器是Windows機器,而我使用的是Windows的任務調度程序和wget每週自動運行一次該腳本。

任何意見和幫助,非常感謝。

回答

2

如果可能,我會做一個更經常運行的計劃任務(cron job),並使用LIMIT 100(或某個其他號碼)一次處理有限數量的用戶。

0

您是否考慮在處理每個用戶時更改邏輯以提交更改?這聽起來像您可能正在運行單個事務來處理所有用戶,這可能不是必需的。

+0

當我循環遍歷所有用戶時,每個用戶都使用單獨的SQL查詢保存數據庫記錄。這是你在'處理每個用戶時提交更改'的含義嗎? –

0

如何增加PHP的執行時間限制?

此外,看看你是否可以改善你的維護程序,使其更快,也可以幫助。根據你在做什麼,你也可以考慮分散一點。偶爾做一次情侶,而不是一次做一次。但取決於你當然在做什麼。

1

爲什麼你仍然不使用cURL的想法,而是隻爲每個用戶處理一個用戶,而是通過將用戶分成1000個或更多組來將一羣用戶發送到一個用戶。

2

幾個想法:

  1. 增加腳本執行時間限制 - set_time_limit()
    不要太過火,但超過30秒將是一個開端。
  2. 軌道保養針對用戶
    也許增加一個字段爲每個用戶,last_check並具有字段設置爲最後的成功的「保養」針對該用戶進行操作的日期/時間。
  3. 工藝小批量
    更好地運行更小的批次更經常。把它看作是PHP的「等於你所有的雞蛋在一個以上的籃子裏」。通過上面的last_check字段,可以很容易地識別自上次更新以來持續時間最長的那些字段,並設置處理這些字段的頻率的閾值。
  4. 運行更加頻繁
    設置一個cronjob和進程,比如每2分鐘記錄100條記錄或類似的東西。
  5. 記錄和檢查你的性能
    有日誌文件和記錄統計。處理了多少記錄,自上次處理多長時間以後,劇本花了多長時間。這些指標將允許您調整批量大小,cronjob設置,時間限制等,以確保最大限度的檢查以穩定的方式執行。

與單個進程相比,設置所有這些可能聽起來像很多工作,但它可以讓您處理增加的用戶量,並且可以爲任何您可能正在查看的進一步維護任務奠定堅實的基礎。跟蹤。