如何在调用Web服务后的某个时间调用函数?
我需要在创建请求后30秒检查请求是否已被接受,类似:
tr -c '[:alnum:]' _ <file
这种方法的问题是睡眠功能(public function create_request(Request $request)
{
$user_id = $request->id;
$validator = Validator::make(
$request->all(),
array(
'request_id' => 'required|numeric|exists:requests,id,user_id,' . $user_id,
));
// Create Request
$requests = new Requests;
$requests->user_id = $user_id;
if ($request->service_type)
$requests->request_type = $request->service_type;
$requests->status = REQUEST_NEW;
$requests->confirmed_provider = $request->provider_id;
$requests->request_start_time = date("Y-m-d H:i:s");
$requests->s_address = $request->s_address ? $request->s_address : "";
if ($request->s_latitude) {
$requests->s_latitude = $request->s_latitude;
}
if ($request->s_longitude) {
$requests->s_longitude = $request->s_longitude;
}
$requests->save();
sleep(30);
$request = Requests::where('id', '=', $request->request_id)->first();
if ($request['provider_status'] == 0) {
Requests::where('id', '=', $request['id'])->delete();
$response_array = array('success' => true , 'message' => Helper::get_message(121));
} else {
$response_array = array('success' => false, 'error' => Helper::get_error_message(161), 'error_code' => 132);
}
return response()->json($response_array, 200);
}
)导致Web服务响应(sleep(30);
)也被延迟。
我期待Javascript中的return response()->json($response_array, 200);
类似
答案 0 :(得分:0)
在start时设置一个会话变量,其值为“set”或其他值。
从功能开始到睡眠(30)的有一个if(variable == "set")
然后在您睡眠的时间点(30),用else
替换它不会检查它是否已设定。
然后使用元标题在30秒后重新加载页面,如果会话变量为“set”,则将其更改为“check”。
这种方式第一次设置,然后下次检查。
答案 1 :(得分:0)
这适用于JavaScript,因为它是异步的,PHP在发送内容之前完全执行;就像你说的那样 - 这会延迟页面加载时间。
我认为你应该研究一下网络套接字,我觉得他们可以更有效地完成这项任务。
我也认为你正在思考某个方向,现在你已经陷入困境了。以您向客户发送交易为例,您可以向他们提供30秒的优惠。您可以在数据库中写入交易创建的初始日期,然后在您的AJAX调用上接受交易,使用您在数据库中保存的日期验证当前时间是否在30秒的时间范围内。这使得系统更加简化,因为您不会让服务器为每笔交易不断使用任何流程。
TL; DR:查看网络套接字或更简化的架构。
答案 2 :(得分:0)
我会创建一个单独的后台进程来检查是否为请求执行了$requests->save()
。
因为它是一个单独的过程,你必须像数据库一样在持久存储中保存一些东西,并且有办法识别它。
您可以像这样运行脚本
exec('php script.php arg1 > /dev/null &')
这将运行script.php
非阻塞,这意味着当前脚本将继续运行而无需等待exec
的响应。 arg1
将在$_SERVER
数组中显示为argv
,第一个参数是正在运行的脚本的名称。
在那个剧本中你会延迟30秒然后再做检查。
没问题。
Windows对于非阻塞脚本来说有点复杂。但可以使用wScript.Shell
$wShell = new \COM('WScript.Shell');
$cmd = 'cmd /C php script.php arg1';
$oExec = $wShell->Run($cmd, 0, false);