2015-02-10 137 views
1

我有以下的困境,我有一個SOAP API,需要優化的方法:異步方法調用PHP

public function myMethodForOptimisation(array $options) { 
    //doing some stuff 

    $this->requestsAnUltraSlowTimeConsumingMethod(); 

    return $someData; 
} 

我並不真的需要等待$this->requestsAnUltraSlowTimeConsumingMethod()我只是異步想定稿對這個方法對客戶說的話做結果和return結果。

需要類似改造它:

public function myMethodForOptimisation(array $options) { 
    //doing some stuff 

    async_method_call($this->requestsAnUltraSlowTimeConsumingMethod()); 

    return $someData; 
} 

是否有async_method_call()在PHP?

+0

線程或fork一個cURL請求。無論哪種方式,您都需要通知主應用程序該資源在某個時間點可用。 – 2015-02-10 13:14:36

+0

但請注意,它在不同的操作系統以及不同的網絡服務器配置上會有所不同。有些方法可能根本無法工作。 – 2015-02-10 13:17:00

+0

'$ someData'從哪裏來?你想從異步調用中返回一些東西嗎? – 2015-02-10 13:18:08

回答

2

你不能異步執行的方法。但是,您可以將數據返回給客戶端,關閉連接,並在斷開連接後執行耗時的方法。

This answer goes in details.

另一種解決方案來執行PHP代碼異步被分岔用pclose函數的新工藝(POPEN())。或者對於一個非常先進的解決方案,您可以查看PHP的線程模塊。

+0

嗯,我會測試,但我想我將不得不發揮它整合在肥皂。 – 2015-02-10 13:28:28

1

你可以使用線程:PHP threading call to a php function asynchronously

這是相當唯一這樣做的方式。有幾種使用它們的方式,所以選擇最適合你的/最簡單的。使用

林這通常:

+0

想一想,但它需要以特定方式編譯PHP,「pthreads需要使用ZTS構建PHP(Zend線程安全)」並不奢侈。 – 2015-02-10 13:17:39

+0

然後你可以使用DB。添加你想要的數據表(ID,數據,請求,任何東西,標誌)。然後設置cronjob。如果標誌設置爲「未完成」,則在cron作業中完成作業並將標誌設置爲「完成」。這可能不是異步的,但它將用戶請求中的半工作移動到服務器端。然後,你可以添加一些簡單的ajax PING和'delayed'request id,這樣用戶可以在它完成並接收它時進行檢查。 – Seti 2015-02-10 16:02:52