2010-04-07 107 views
6

我已經安排了CRON工作,每4小時運行一次,需要收集用戶帳戶信息。 現在我想加快速度並在幾個進程之間分割工作,並使用一個進程來更新MySQL數據庫與其他進程的檢索數據。PHP線程池?

在JAVA中,我知道有一個線程池,我可以用一些線程來完成一些工作。

我該如何在PHP中做到這一點?

歡迎任何建議。

謝謝

+0

cron作業執行什麼?運行php腳本的服務器的shell腳本和/或php腳本和/或頁面請求? – zaf 2010-04-07 11:58:47

+0

一個PHP腳本,它使用curl庫來解析某些用戶帳戶數據。 – embedded 2010-04-07 12:16:21

回答

1

正如其他人所說,分叉過程比使用PHP產卵線程更容易。但是,爲什麼你認爲有一個專用線程將結果寫回數據庫是個好主意?雖然這與線程而不是進程稍微簡單一些,但它仍然是一個複雜的開銷,似乎並沒有爲總體目標增加任何價值。

事實上,從cron啓動腳本的幾個實例(用一些參數來分區數據),而不是從PHP代碼中啓動一個分支 - 而且沒有任何瓶頸來記錄數據回到數據庫中。

C.

+0

這是一個很好的選擇,IMO比分叉處理好得多。 你有沒有想法如何分割數據,我應該運行多少個實例而不是系統開銷? 我在想3個實例。 – embedded 2010-04-08 06:39:54

+0

儘可能多的實例。如果數據由序列號或其他數字標識,則使用MOD來獲得每個第N種情況,例如, 'SELECT * FROM mytable WHERE MOD(id,$ number_of_instances)= $ this_instance_id'(記得運行第0個實例) – symcbean 2010-04-08 11:49:28

+0

謝謝我會看看MOD選項。 – embedded 2010-04-08 14:12:18

0

再檢查一下這些帖子 - * http://www.alternateinterior.com/2007/05/multi-threading-strategies-in-php.html * http://www.electrictoolbox.com/article/php/process-forking/

基本上你需要在進程之間共享數據,正如我所見,你可能需要寫入一些文件第一。使用主進程(使其成爲ajax輪詢類型進程)並寫入數據庫。

+0

你是什麼意思由ajax-polling類型的過程? 我想我會走你的路和叉一些進程來完成任務 並將結果追加到文件。 主進程將獲取文件中當前可用的所有記錄,清除該文件,然後釋放鎖並將處理它們。 我將在專用文件上使用鎖定以防止對文件進行多路訪問。 你對這種行爲有什麼看法? – embedded 2010-04-07 12:09:54

+0

這種行爲正是我想到的。在你的情況下,由於它是cron-job,它將以特定的時間間隔繼續運行,並從文件中收集數據,然後寫入數據庫。 Ajax輪詢將用於Web服務器方法,您可以使用JavaScript來製作ajax請求而不是cron作業。 – pinaki 2010-04-07 12:21:47

+0

我想我會實現這一點,並使用它時,我看到我的cron作業執行需要超過4個小時。 在網絡託管方面,我需要確保pcntl庫已啓用? – embedded 2010-04-07 12:28:14

0

您可以在PHP中派生新進程過於:pcntl_fork()

BTW。該腳本運行時間超過4小時?否則,我看不出有什麼理由使它與線程或流程管理複雜化。

+0

這可以動態更改。 這取決於使用我的服務的用戶數量。 我將只在腳本執行時間超過4小時時使用這種機制 – embedded 2010-04-07 12:13:31

2

PHP和Threads(這兩個詞)不能在同一句話中一起出現。 PHP不提供線程支持。你可以嘗試pcntl分叉機制或異步處理,在你的情況下這是不是有用的。

你可以使用一個工作量分配機制,可能是你想看看Gearman(建議你谷歌它)。

正如其他人所描述的「它是一個分佈式分岔機」,它可以提供您正在尋找的工作負載分配以「加快速度」。

問候,

+0

我會仔細看看它。 網絡託管服務提供商是否支持此套件? – embedded 2010-04-07 13:34:52

+0

這只是你安裝的一個庫 - 服務器和客戶端 - 你啓動deamon,你已經準備好接受處理請求了(強烈建議分發工作量) - http://gearman.org/ - 檢查演示文稿也 – Andreas 2010-04-07 13:42:46

+0

我認爲這是滿足我的需求的方式。 我會執行我自己的機制。 謝謝 – embedded 2010-04-07 13:43:59