2015-07-19 76 views
3

我從某些Web服務獲取信息,但我希望我調用的方法只是異步的,因爲請求時間太長,以致網站加載速度變慢。PHP中的異步網絡服務

我目前使用正常的SOAP調用

$client = new SoapClient("http://xxxx.com/webservices/json.asmx?WSDL"); 

$result = $client->__soapCall($id, $parameters); 

有人可以幫我請

+0

即使您實現了來自PHP的異步調用,您仍然需要等待X個時間,直到結果返回到PHP腳本。你的網站仍然會掛起,你什麼也沒有取得。在您的應用程序(客戶端)中實施加載指示器,並且不要對緩慢的服務執行太多的SOAP請求。 – Mjh

回答

1

這種正常的做法是不是隻在服務器端異步的策略,因爲這不符合php的工作原理,而是應用這種策略:

您處理請求並將HTML頁面響應給客戶端,該客戶端具有緩慢API調用結果的容器元素,但容器留空或者包含一個佔位符,另外一個客戶端邏輯被提供,所以javascript,它向客戶端的文檔就緒事件註冊一個處理程序,在這個處理程序中,它發出一個jax請求回到服務器,通常每個API調用都需要執行一個請求。在ajax請求中收到的有效負載用於使用最終數據填充html內的容器。

通過這種方式,頁面/視圖本身的生成和呈現與完全等待API調用分離。此外,策略是透明的,用戶可以看到額外的數據被提取出來,這使得等待期從心理學的角度來看更加可以接受。

您可以想到該策略的一種變體,它已經註冊了基於服務器的作業,執行實際的API調用並緩存結果。這樣你就可以保持發送頁面的雙向延遲,並等待ajax調用進來。然而,這裏面臨的挑戰是保持這些作業與原始請求之間的連接,其後續的ajax調用不是一個簡單的任務。通常,這種優勢根本無法證明額外的努力。

所以作爲底線可以說,通常在純php中沒有異步策略被實現。相反,原始請求被分成幾個獨立的請求。只有第一個請求被立即處理和響應,獨立於任何緩慢的API調用。然後,並行地,ajax請求觸發API調用並將結果信息添加到對第一個請求的響應中。

0

異步 - 它不是關於PHP。 腳本按原樣工作,一行一行,我們無能爲力。 如果你想快速完成任務(更接近異步),你應該重新構建你的應用程序架構。

https://en.wikipedia.org/wiki/Service-oriented_architecture

首先,你應該有一些「公交車」事件,一個腳本放在那裏的一些命令,其他腳本(惡魔)偵聽並執行該命令。

這裏的利潤是,將公共汽車的某些命令更快(我們甚至不需要等待響應)然後做實際的工作。實際工作($客戶端=新SoapClient的(...)這裏應該由其他腳本來完成。

對不起英語

0

這也取決於你是否需要網絡服務的輸出。

如果您需要它,請使用Ajax方式或服務方式。您也可以使用隊列來管理作業,如Redis或beanstalkd。

如果你不需要輸出,只是想調用API,那麼你也可以把這些代碼在另一個腳本,並調用它的背景下,像

shell_exec('php script.php someargs >/dev/null 2>&1 &'); 

通知的重定向,他們是需要的。