正常情况下,PHP执行的都是同步请求,代码自上而下依次执行,但有些场景如发送邮件、执行耗时任务等操作时就不适用于同步请求,只能使用异步处理请求。

场景要求:

客户端调用服务器a.php接口,需要执行一个长达10s-20s不等的耗资源操作,假如客户端响应请求时间为5秒(请求响应超时时间),5s以上无回复即断开连接。

解决设想:

客户端调用a.php之后,a.php执行异步多线程操作调用b.php,a.php调用成功后即刻反馈给客户端回执,b.php自动执行耗资源操作。

方案:

利用fsockopen()方法解决PHP异步请求

1.封装异步请求函数asyncRequest(),代码如下:

/**
* php异步请求
* @param $host string 主机地址
* @param $path string 路径
* @param $param array 请求参数
* @return string
*/
private static function asyncRequest($host, $path, $param = array()){ $query = isset($param) ? http_build_query($param) : '';
Bd_Log::debug($query);
$port = 80;
$errno = 0;
$errstr = '';
$timeout = 30; //连接超时时间(S) $fp = @fsockopen($host, $port, $errno, $errstr, $timeout);
//$fp = stream_socket_client("tcp://".$host.":".$port, $errno, $errstr, $timeout); if (!$fp) { Bd_Log::debug('连接失败');
return '连接失败';
}
if ($errno || !$fp) { Bd_Log::debug($errstr);
return $errstr;
} stream_set_blocking($fp,0); //非阻塞
stream_set_timeout($fp, 1);//响应超时时间(S)
$out = "POST " . $path . " HTTP/1.1\r\n";
$out .= "host:" . $host . "\r\n";
$out .= "content-length:" . strlen($query) . "\r\n";
$out .= "content-type:application/x-www-form-urlencoded\r\n";
$out .= "connection:close\r\n\r\n";
$out .= $query; $result = @fputs($fp, $out); @fclose($fp);
return $result; }

实例:

正常接口a.php,如下

    /**
* 正常接口a.php
* @param $host string 主机地址
* @param $path string 路径
* @param $param array 请求参数
*/
  public function a(){
$param = array(
'XXX' => $XXX,
);
$asyncData = $this->asyncRequest( $host, $path ,$param); echo'a.php success'
  }

耗时接口b.php,如下

    /**
* 耗时接口b.php,依次输出三种结果
*/
public function b(){      set_time_limit(0);
ignore_user_abort(true);//设置与客户机断开是否会终止执行
fastcgi_finish_request();//提高请求的处理速度
  
sleep(30);
echo "耗时30秒"; sleep(20);
echo "耗时20秒"; sleep(10);
echo "耗时10秒";
}

上述实例即为简单的测试接口部分代码,根据自己需求做修改即可;

最新文章

  1. 安卓四核PDA手持PDA智能POS机 打印二维码 分享
  2. [VSTS] 从零开始 Team Foundation Server 2010 安装配置详细图文教程
  3. C#调用有有参有返的存储过程
  4. 一、午夜倒数《苹果iOS实例编程入门教程》
  5. eclipse中的web项目路径和发布好的项目路径
  6. Python中dict详解
  7. Big Event in HDU(HDU 1171 多重背包)
  8. Python 3.6.3 利用Dlib 19.7库进行人脸识别
  9. Java数据结构和算法(十四)——堆
  10. 获取电脑系统唯一GUID
  11. GBDT 算法:原理篇
  12. Mybatis的应用1 Mybatis和logback的应用配置
  13. loj6045 价
  14. JS -- serializeJSON
  15. 帝国cms建站总结-(分页)
  16. mysql索引类型和方式
  17. 1.2环境的准备(二)之Pycharm的安装和使用
  18. Golang的字符编码介绍
  19. Linux - awk 文本处理工具三
  20. (笔记)Mysql命令alter add:增加表的字段

热门文章

  1. py3 pymysql
  2. Linux软件开发常用的软件包(持续更新中)
  3. dubbo+zipkin调用链监控(二)
  4. C# StreamReader.ReadLine统计行数的问题
  5. git关联远程仓库
  6. HRMS(人力资源管理系统)-SaaS架构设计-概要设计实践
  7. Jupyter notebook安装扩展插件
  8. ionic cordova plugin 安装和使用
  9. 图 总结 AI
  10. Asp.net的HttpContext.Current.Items详解