2013-01-09 161 views
44

我正在研究PHP Web應用程序,我需要在請求中執行一些網絡操作,例如根據用戶的請求從遠程服務器獲取某人。PHP中的異步函數調用

是否有可能模擬PHP中的異步行爲,因爲我必須將某些數據傳遞給函數,並且還需要從中輸出。

我的代碼是這樣的:

<?php 

    $data1 = processGETandPOST(); 
    $data2 = processGETandPOST(); 
    $data3 = processGETandPOST(); 

    $response1 = makeNetworkCall($data1); 
    $response2 = makeNetworkCall($data2); 
    $response3 = makeNetworkCall($data3); 

    processNetworkResponse($response1); 
    processNetworkResponse($response2); 
    processNetworkResponse($response3); 

    /*HTML and OTHER UI STUFF HERE*/ 

    exit; 
?> 

每個網絡操作需要大約5秒鐘即可完成總共15秒增加給我的應用程序的響應時間,我做3個請求。

makeNetworkCall()函數只是做一個HTTP POST請求。

遠程服務器是第三方API,所以我沒有任何控制權。

PS:請不要回答關於AJAX或其他事情的建議。我目前正在尋找,如果我可以通過PHP來做到這一點,可以用C++擴展或類似的東西。

+0

嘗試使用'CURL'開火請求,並從網絡...... [PHP線程調用PHP函數異步(的 –

+0

可能重複http://stackoverflow.com/questions/13846192/獲取一些數據php-threading-call-to-a-php-function異步) – CRABOLO

+0

你可以使用PHP的[stream_select](https://secure.php.net/manual/en/function.stream-select.php)函數來運行非阻塞代碼。 [React](http://reactphp.org/)使用它創建一個[類似於node.js的事件驅動循環](https://speakerdeck.com/igorw/react-phpnw)。 –

回答

26

我認爲,答案奠定了這裏:

PHP threading call to a php function asynchronously

快速注:使用線程

+2

主要是,我沒有在我的答案中提到線程的原因是因爲OP提到他們正在構建一個Web應用程序。在Apache下使用PHP中的線程可能很危險,而且真的需要考慮他們在做什麼。但是,如果這對他有效,那麼太棒了! –

+10

@ColinMorelli你能解釋一下關於危險的一點嗎?我正在考慮使用Threds,但也想考慮它們。 – Manuel

+0

我會說,嘗試系統日誌。 http://php.net/manual/en/function.syslog.php – Abhidemon

2

cURL將成爲您唯一真正的選擇(或者使用非阻塞套接字和一些自定義邏輯)。

This link應該向正確的方向發送您。在PHP中沒有異步處理,但如果您嘗試同時發出多個Web請求,則cURL multi將爲您處理此問題。

1

我認爲如果HTML和其他UI的東西需要返回的數據,那麼就不會有一種方法來異步它。

我相信PHP來做到這一點的唯一方法是登錄數據庫的請求,並有一個cron檢查每分鐘,或使用類似的Gearman隊列處理,或也許EXEC()命令行過程

在此期間,您的PHP頁面將不得不生成一些html或js,使其每隔幾秒鐘重新加載以檢查進度,這並不理想。

爲了避開這個問題,你期望有多少個不同的請求?你能否每小時自動下載一次並保存到數據庫中?

2

如今,它是更好地使用queues比線程(對於那些誰不使用Laravel有噸其他實現在那裏like this)。

其基本思想是,您的原始PHP腳本將任務或作業放入隊列中。然後你有在其他地方運行的隊列作業工作者,將作業從隊列中取出,並開始獨立於原始PHP處理它們。

的優點是:

  1. 可擴展性 - 你可以添加工作節點,以跟上需求。這樣,任務就可以並行運行。
  2. 可靠性 - 現代隊列管理器,如RabbitMQ,ZeroMQ,Redis等,都是非常可靠的。