如何在调用Web服务后的某个时间调用函数?

时间:2017-11-15 20:05:22

标签: php

如何在调用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);类似

3 个答案:

答案 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);