php异步调用

2018-08-31 11:47:14


  • 有的时候我们再用php执行某些耗时的任务时需要迅速的对前端进行反馈,但并不需要立即反馈执行结果,只是给予前端一个响应时,这个时候我们就可以用php的异步调用技术。

  • php异步调用的方法有很多,本次我将使用fsockopen来进行异步调用。通过fsockopen触发一个php脚本让其执行的同时不去等待其响应的结果,即可实现异步的调用。

  • 首先通过fsockopen打开一个连接 $fp = fsockopen($host, 80, $errno, $errstr, 3);

  • 第一个参数时你的主机参数,如果是https的话则需要在其前面添加ssl://的前缀,第二个参数则是端口号,第三和第四个参数是接受错误信息,第五个参数则是设置连接的时限,单位是秒。

  • 接下来便是凑齐http头信息

if($fp){
            $out = "POST $path HTTP/1.1\r\n"//$path为接口的路径
            $out .= "HOST: $host\r\n"
            $out .= "Connection:Close\r\n"
            $out .= "Content-Type: application/x-www-form-urlencoded\r\n"
            $out .= "Content-Length: $len\r\n\r\n"//由于是进行POST请求,因此需要在传输的数据前换两行
            $out .= $xtemp;//拼接需要传输的数据,格式为var1=value1&var2=value2
        }
fwrite($fp, $out);//将连接头信息写入套接字中
fclose($fp);
  • 最后在需要执行耗时任务的脚本页面的头部添加如下两条语句
ignore_user_abort(true); //如果客户端断开连接,不会引起脚本abort.
set_time_limit(0);//取消脚本执行超时上限
  • 这两条语句分别是忽略用户断开连接而导致脚本中断运行和取消脚本的执行超市时间,这样就可以确保脚本正常执行完毕。

php异步的一个应用场景 在做微信公众号开发的时候,如果需要执行一些合成图片等耗时的任务,但微信却又要求在短时间内返回信息,这时就可以利用php的异步调用功能,将耗时的任务进行异步调用,先给微信返回一个空字符串防止公众号超时,然后在有结果以后再主动将结果进行推送。 参考链接-使用fsock实现异步调用PHP