2010-02-15 36 views
4

我有一個mysql數據庫表充滿了1000 +記錄,可以說5000個記錄。每條記錄都有一個processed布爾標誌,默認爲false (0)。我想要做的是每分鐘都在cron上運行一個PHP腳本。它的代碼是這樣的:可以使用Cron作業來使用PHP來模擬多線程嗎?

<?php 
process(); 

function process() 
{ 
    $sql = "SELECT id FROM items WHERE processed = '0' ORDER BY id ASC LIMIT 1"; 
    $result = $this->db->query($sql); 

    if (! $result->has_rows()) 
    die; 

    $id = $result->getSingle('id'); 
    processItem($id); //Will set processed to 1 after processing is done 
    process(); 
} 
?> 

它應該很清楚上面的代碼做什麼,它得到的是未經處理的下一個記錄的ID,處理它,然後再調用process()功能重複這個過程,直到沒有更多的項目需要處理,此時執行會停止。

通過把這個腳本放在Cron上每分鐘運行一次,我希望這個腳本有多個實例可以同時處理這些物品,所以不需要一次處理一件物品,可以獲得5-10個物品同時處理。

1)這會按照我計劃的方式工作嗎?任何改進建議/要注意的事項?

2)如果我有腳本設置爲運行的實例數的計數器,所以每當一個cron作業啓動,它會檢查計數器,如果50(?)情況下運行,將退出而不處理。這可能會讓服務器因使用過多內存而導致運行進程太多而崩潰。有什麼想法嗎?

+1

事實上,它看起來像上面的代碼沒有做任何事情做的'限制0' –

+0

哎呀,固定的:) –

回答

7

我有幾件事要說:

首先,你正在使用遞歸來處理多行。這可能會導致問題,如果你遞歸太深。而是使用一個簡單的循環。

其次,你知道這段代碼是否可以從多次運行中受益?如果機器受CPU限制,它可能不會受益於另一個線程。我建議你手動檢查有多少線程工作最好。更多的線程並不總是讓事情變得更快,並且在某些情況下實際上可以放慢一切。

最後,我一定會穿上有多少這些腳本可以同時運行的限制。這可以通過確保每個腳本運行時間不超過5分鐘來實現。或者,您可以保留一些活動腳本並確保它不超過您在第二條建議中確定的最大數量。

編輯:我已經添加了有關該問題的遞歸一些更多的信息可能會導致: 每次遞歸調用函數額外的空間用完堆棧。該空間存儲任何局部變量以及函數的地址(允許它在被調用的函數退出時恢復狀態)。堆棧只有有限的空間,所以最終你的程序會因堆棧溢出而崩潰。嘗試運行這個簡單的程序:

function a($i) { 
    print $i . "\n"; 
    a($i + 1); 
} 
a(0); 

在我的系統上它608739迭代後崩潰的PHP。這個數字在更復雜的功能中可能會小很多。一個簡單的循環沒有這些開銷,因此它沒有這個問題。

+0

感謝你的回答。遞歸會導致什麼問題? –

+0

我已經回答了有關遞歸在主要答案主體中可能導致什麼問題的問題。 – bramp

+0

感謝隊友,尤其是關於檢查腳本是否已經運行5分鐘並終止腳本的提示。感謝你的幫助 :) –

1

遞歸似乎並沒有在所有必要的,像bramp說,可能會導致問題。爲什麼不

$sql = "SELECT id FROM items WHERE processed = '0' ORDER BY id ASC LIMIT 1"; 

while (($result = $this->db->query($sql) && $result->has_rows()) { 
    processItem($result->getSingle('id')); 
} 

然而,我在這裏預見更大的問題。如果您打算每分鐘運行一次這個腳本,您有什麼機制來停止執行之前執行的腳本,這些腳本可能仍在運行?您最終可能會多次處理相同的ID。

如果你絕對需要一個(僞)多線程的方式,我建議如下:

  1. 搶範圍或所有未處理的ID,而不僅僅是一次一個。
  2. 使用curl_multi_函數系列,將上述結果的子集(n id的組)傳遞給另一個腳本以執行實際處理。

該方法允許您更好地控制整個過程,並防止不必要的單個查詢獲取未處理的ID。

0

我開始了一個項目來解決完全相同的問題。它可以持續運行一個腳本,並且如果需求較高,可以並行運行更多的實例。如果沒有什麼可做的事情,那麼它將在運行腳本實例之前等待指定的時間間隔。

如果你有興趣,然後有一個通過一些使用情況如下:www.4pmp.com/fatcontroller/