2013-02-09 20 views
2

我有一個MySQL數據庫表,我需要處理。處理3行大約需要1秒(由於我需要爲每行創建CURL連接)。所以,我需要分叉PHP腳本才能擁有合理的時間(因爲我將爲一批處理多達10,000行)。PHP分叉和處理MySQL數據庫沒有衝突

我打算一次運行10-30個進程,顯然我需要一些方法來確保進程不重疊(就他們正在檢索和修改的行而言)。

從我讀過的,有三種方法可以實現這一點。我試圖決定哪種方法最適合這種情況。

選項1:開始一個事務並使用SELECT ... FOR UPDATE並限制每個進程的行數。將數據保存到數組。用狀態標誌「處理」更新選定的行。提交事務,然後將選定的行更新爲「已完成」狀態。

選項2:更新狀態標誌爲「正在處理」的一定數量的行和進程標識。選擇該進程ID和標誌的所有行。像正常一樣處理數據。更新這些行並將標誌設置爲「已完成」。

方案3:設置每個進程的SELECT查詢LIMIT ... OFFSET ...條款,使每一個過程變得一起工作唯一的行。然後存儲行ID並完成後執行並且UPDATE

我不確定哪個選項最安全。我認爲選項3似乎很簡單,但我不知道有什麼辦法可能會失敗嗎?選項2也似乎很簡單,但我不確定由於UPDATE導致的鎖定是否會導致一切放緩。選項1似乎是最好的選擇,但我不太熟悉FOR UPDATE和交易,並可以使用一些幫助。

更新:爲了清楚起見,我目前只有一個文件process.php,它選擇所有行並通過Curl逐個將數據發佈到第三方。我想在這個文件中有一個分支,所以10,000行可以分成10-30個子進程。

+0

您是否需要爲每項工作啓動一個流程?每一行都是獨立的工作嗎? – Brad 2013-02-09 20:41:01

+0

每行都包含一個ID和一些文本,這些文本將通過Curl張貼到第三方。返回的響應也將被放入不同的表格中。目前我只有一個循環遍歷返回的所有行,並逐個執行。我想分散在10-30個流程。 – 2013-02-09 20:48:12

+3

爲什麼不使用多捲曲並將其留在單個過程中? – Brad 2013-02-09 21:16:50

回答

0

我結束了使用mult_curl功能(如提出布拉德)來完成這一任務。我使用array_chunk()將行數組劃分爲100個組,然後配置一個multi_curl任務來處理它們。我開始使用ParallelCurl,但最終沒有正常工作,所以我只是自己編寫了mult_curl代碼。

它花了近2小時處理10,000個捲曲連接,只需幾分鐘。

+0

嗨特雷弗,我有同樣的問題,你可以發佈一個鏈接到一個例子或腳本?這將是高度讚賞! – mongotop 2013-02-27 03:54:49

0

處理此問題的另一種方法是將需要處理的id放入redis隊列(列表)中。然後您可以從列表中彈出/推送項目。當len(list)爲空時,你知道沒有什麼可以處理的。

還有一個php resque項目,它將實現你想要做的一些工作排​​隊。

https://github.com/chrisboulton/php-resque