2015-06-18 63 views
0

我必須使用一個異步服務。我所能做的就是將數據發送到此服務(我正在使用PHPCURL)並將數據發送到此服務的某個網址。我該如何反應/等待這項服務的迴應? 現在我有兩頁:第一個是發送數據到服務,第二個從這個服務獲取響應並將其插入數據庫。在第一頁,我正在查看某個表,而沒有響應。但是,從數據庫每秒選擇幾次是不好的主意。但是我需要:從一個頁面發送數據並在同一頁面獲得響應。我想我可以使用一些Ajax並使異步服務將數據發送到同一頁面並等待此頁面上的響應。異步API和回調

我想我寫的很辛苦,因爲我不能完全解釋我需要什麼,所以隨時糾正我。

+1

PHP有沒有asynchronousity的概念。另外你是什麼意思的異步服務?這是一個web服務,它接受回調端點或什麼? – Steve

+0

@Steve我知道PHP沒有異步的概念,所以我注意到我想我必須使用Ajax。是的,這是可以獲得一些數據並在結束後將結果發送到某個URL的Web服務 – Daria

+0

_I有兩個頁面:第一個是將數據發送到服務,第二個從該服務接收響應並將其插入到數據庫中_爲什麼兩個?服務響應是否太慢? – hindmost

回答

1

正如@Steve指出的那樣,PHP沒有異步概念。但是有一個黑客可以實現類似於PHP中的長輪詢。重點是使用準備好的Javascript文件,即JSON。

這是一個一般流程:

  1. 您的單一網頁不AJAX請求你的PHP腳本發送 適當的請求到外部服務並立即返回 一些反應(例如空)的網頁。
  2. 網頁開始向服務器反覆請求相同的靜態 JSON文件(通過執行AJAX請求)直到出現(由 創建回調腳本)。
  3. 外部服務將針對您的回調腳本 保存響應爲JSON文件。
  4. 網頁從JSON文件獲取響應並將其輸出。
+0

謝謝你的答案,但使用文件對我來說是非常糟糕的主意。我無法在飛行中接收數據嗎?所以我決定做什麼:當我向外部服務發送請求時,我得到一些'task_id',並且當數據來自外部服務時,我使用ajax等待,而帶有此task_id的數據出現。但到目前爲止,我不知道如何實現這個 – Daria

+0

@ Steve.B _使用文件對我來說是一個非常糟糕的主意_爲什麼它不好?你能澄清嗎?您不能等待腳本啓動對服務的請求中的響應,因爲響應將發送到另一個腳本(回調腳本)。 – hindmost

1

您最簡單的選擇將是ajax輪詢 - 將請求發送到web服務,然後每隔x秒輪詢一次。響應處理程序(完成時由webservice調用的腳本)需要將數據保存在某處,例如數據庫或會話,輪詢腳本將檢查此數據。

這雖然會稍微增加服務器的負載,如果您設置的輪詢間隔足夠高,應該沒事

session_start(); 
if(isset($_GET['sendrequest'])){ 

    WebService:sendRequest(['callback_url'=>'thispage?receiveresponse=1']) 
    $_SESSION['response']=false; 
    die(); 
}elseif(isset($_GET['receiveresponse'])){ 

    $response = WebService:receive(); 
    $_SESSION['response'] = $response; 
    die(); 

}elseif(isset($_GET['checkresponse'])){ 

    $data=[]; 
    if($_SESSION['response']){ 
     $data['success']=true; 
     $data['response']=$_SESSION['response']; 
    }else{ 
     $data['success']=false; 
    } 

    header('Content-Type: application/json'); 
    die(json_encode($data); 
} 
<html> 
    <head>....</head> 
    <body> 

    <a id="send" href="#">Send Request</a> 
    <div id="response"></div> 

    <script> 
     var poll; 
     $('#send').click(function(ev){ 
      ev.preventDefault(); 
      $post('?sendrequest=1', {...}, function(){ 
       poll = setInterval(function(){ 
        $get('?checkresponse=1', function(response){ 
         if(response.success){ 
          clearInterval(poll); 
          $('#response').html(response.response); 
         } 
        }); 
       }), 3000); 
      }); 
     }); 
    </script> 
    </body> 
</html>