异步API和回调

时间:2015-06-18 09:51:13

标签: javascript php ajax curl asynchronous

我必须使用一个异步服务。我所能做的就是将数据发送到此服务(我正在使用PHPCURL)并将数据发送到此服务的某个网址。我该如何反应/等待此服务的响应? 现在我有两个页面:第一个是向服务发送数据,第二个是从此服务获取响应并将其插入数据库。在第一页上,我正在检查一些表,而没有响应。但是,每秒从数据库中选择几次是个坏主意。但我需要:从一个页面发送数据并在同一页面获得响应。我想我可以使用一些Ajax并使异步服务将数据发送到同一页面并等待此页面上的响应。

我想我写的非常努力,因为我无法完全解释我的需要,所以请随时纠正我。

2 个答案:

答案 0 :(得分:1)

正如@Steve所说,PHP没有异步的概念。然而,有一个hack允许在PHP中实现类似于长轮询的东西。重点是使用准备在Javascript中读取的文件,即JSON。

以下是一般性流程:

  1. 您的单个​​网页会向发送的php脚本发出AJAX请求 对外部服务的适当请求并立即返回 对网页的一些回应(例如空)。
  2. 网页开始反复请求服务器获取相同的静态 JSON文件(通过执行AJAX请求)直到它出现(由...创建) 回调脚本)。
  3. 外部服务将响应传递给您的回调脚本 将响应保存到JSON文件中。
  4. 网页从JSON文件中获取响应并输出。

答案 1 :(得分:1)

您最简单的选择是ajax轮询 - 将请求发送到Web服务,然后每隔x秒轮询一次。响应处理程序(Web服务完成时调用的脚本)需要将数据保存在某处,例如数据库或会话,并且轮询脚本将检查此数据。

虽然这会给服务器负载增加一点,但如果你将轮询间隔设置得足够高就应该没问题

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>