簡體   English   中英

在PHP中運行異步函數的最有效方法是什么?

[英]What's the most efficient way to run asynchronous functions in PHP?

我正在開發一個利用亞馬遜MWS API的應用程序,主要用PHP編寫。 此應用程序允許亞馬遜賣家注冊,提供一些亞馬遜賣家憑證,然后應用程序開始從亞馬遜下載此用戶的訂單,將他們放入MySQL數據庫。

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

我是PHP的新手,特別是從它運行異步進程。 我發現我能做到這一點的唯一方法是使用一個啟動腳本來查找數據庫中的所有用戶,並為每個用戶生成一個同步腳本然后釋放它。 我不喜歡這個想法,因為如果我有500多個用戶,我的夜間同步將包含500個這個PHP腳本的衍生實例。

以前有人做過類似的事嗎? 如果是這樣,我很想知道如何最好地使這種同步更有效率。

由於PHP不能是多線程1 ,實際上你只有2個選擇(有幾種方法可以做到這一點,但它們都歸結為以下類別):

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

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

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

1 編輯03/2013:PHP現在可以是多線程的,但不推薦用於生產用途,因為pthreads擴展仍然非常不穩定,並且不建議普通用戶使用它,只有在你真正知道自己在做什么時才使用它

同意使用DaveRandom,查看HTTP請求池以實現,而不是滾動自己的http://www.php.net/manual/en/class.httprequestpool.php

我最終使用passthru並將腳本傳遞給后台。 到目前為止,事情似乎運作良好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM