我必须使用一个异步服务。我所能做的就是将数据发送到此服务(我正在使用PHP
和CURL
)并将数据发送到此服务的某个网址。我该如何反应/等待此服务的响应?
现在我有两个页面:第一个是向服务发送数据,第二个是从此服务获取响应并将其插入数据库。在第一页上,我正在检查一些表,而没有响应。但是,每秒从数据库中选择几次是个坏主意。但我需要:从一个页面发送数据并在同一页面获得响应。我想我可以使用一些Ajax并使异步服务将数据发送到同一页面并等待此页面上的响应。
我想我写的非常努力,因为我无法完全解释我的需要,所以请随时纠正我。
答案 0 :(得分:1)
正如@Steve所说,PHP没有异步的概念。然而,有一个hack允许在PHP中实现类似于长轮询的东西。重点是使用准备在Javascript中读取的文件,即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>