2011-10-17 127 views
5

我正在研究一個應用程序,該應用程序主要使用PHP編寫的利用亞馬遜的MWS API。這個應用程序允許亞馬遜賣家註冊,提供一些亞馬遜賣家的憑證,然後應用程序開始從亞馬遜下載這個用戶的訂單,將它們放入MySQL數據庫。什麼是在PHP中運行異步函數的最有效方法?

我已經構建了使用具有多個函數的腳本將數據準確地同步到數據庫的方法,但注意到這需要太長時間。該腳本簡單循環遍歷數據庫中的所有用戶,並一次迭代所有訂單。目前,只有5個測試用戶,時間是可行的,但我正在尋找一種更可擴展的方法。想想每次同步運行的500個用戶。太久了!

我對PHP很陌生,特別是從它運行異步過程。我發現我可以做到這一點的唯一方法是擁有一個初始腳本,用於查找數據庫中的所有用戶,併爲每個用戶生成一個同步腳本,然後釋放它。我不喜歡這個想法,因爲如果我確實有500多個用戶,我每晚同步將包含500個衍生的PHP腳本實例。

以前有沒有人做過類似的事情?如果是這樣,我很想聽聽如何更好地使此同步更有效。

回答

1

同意瓦特/ DaveRandom,檢查HTTP請求池實施,而不是滾動您自己http://www.php.net/manual/en/class.httprequestpool.php

+0

我從來沒有聽說過HTTPRequestPool類,謝謝!但是,從這我可以弄清楚如何讓它發送異步HTTP請求,但我也需要處理我分別從這些檢索到的每個結果。這可以做到嗎? –

+0

我相信如此。你有閱讀文檔嗎?特別是檢查「getFinishedRequests」方法 - http://www.php.net/manual/en/function.httprequestpool-getfinishedrequests.php – rICh

2

由於PHP不能多線程,在實踐中你只有兩個選擇(有幾種方法來做到這一點,但他們都歸結爲以下至類別):

  • 有每個用戶操作1個進程。正如你所說,對於大型數據庫,這可能會導致很多進程。
  • 有一個處理多個用戶的進程。這可能需要更長的時間,因爲每個過程都是有效同步的。

我認爲最好的辦法就是將兩種方法結合起來,因此您有多個處理多個用戶的流程。所以如果你有500個用戶,產生100個進程,每個進程處理5個用戶,或50個進程處理10個用戶。

另外,使用更適合該任務的語言編寫程序可能是值得的 - 它支持多線程,如Java或Perl,如果需要,可以從PHP開始。

編輯03/2013:PHP現在可以是多線程的,但其不推薦用於生產用途爲pthreads擴展仍然十分不穩定,它也不會推薦給普通用戶來說,只要使用此你真的知道你在做什麼

+0

感謝您的回覆。我寧願將它保留在PHP中,因爲整個應用程序都是用PHP編寫的,但實際上這可能是更好的解決方案。這是PHP的一個巨大缺陷。 ( –

+0

)出於興趣,你是如何產生子進程的?用'pcntl_fork()','exec('php script.php>/dev/null &');'或其他一些我現在無法想到的方法? – DaveRandom

+0

我還沒有想出一個明確的解決方案,但是我的想法是使用exec函數 –

0

我結束了使用中繼並通過腳本的背景。事情似乎迄今運作良好。

相關問題