我有一個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個子進程。
您是否需要爲每項工作啓動一個流程?每一行都是獨立的工作嗎? – Brad 2013-02-09 20:41:01
每行都包含一個ID和一些文本,這些文本將通過Curl張貼到第三方。返回的響應也將被放入不同的表格中。目前我只有一個循環遍歷返回的所有行,並逐個執行。我想分散在10-30個流程。 – 2013-02-09 20:48:12
爲什麼不使用多捲曲並將其留在單個過程中? – Brad 2013-02-09 21:16:50