PHP通过fsockopen实现异步请求方法
程序员文章站
2024-01-28 10:38:46
...
前言
最近在开发项目的过程中需要对接第三方应用,但是第三方为了安全和性能要求是回调接口1秒内必须有返回值,而我们的业务逻辑也非常复杂,1秒时间可能不够。所以我们决定当第三方请求接口时先给一个返回值,然后再使用fsockopen()函数模拟 HTTP 连接异步处理业务逻辑。
实现方法
开启PHP fsockopen这个函数
PHP fsockopen需要 PHP.ini 配置文件中 allow_url_fopen 选项开启。
allow_url_fopen = On
函数语法
int fsockopen(string hostname, int port, int [errno], string [errstr], int [timeout]);
参数
hostname 如果安装了OpenSSL,你需要在主机名地址前面添加访问协议ssl。
port 端口号。
errno 如果errno的返回值为0,而且这个函数的返回值为 FALSE。
errstr 错误信息将以字符串的信息返回。
timeout 设置连接的时限,单位为秒。
下面是fsockopen模拟php post请求,代码如下
//sock post
sock_post(C("NOTIFY_GATE_DOMAIN"),U('Api/Notify/sync_org'),$params);
function sock_post($host,$path, $params){
$query = http_build_query($params);
$fp = fsockopen('ssl://'.$host, 443, $errno, $errstr, 3);
$head = "POST ".$path."?".$query." HTTP/1.0\r\n";
$head .= "Host: ".$host."\r\n";
$head .= "Referer: http://".$host.$path."\r\n";
$head .= "Content-type: application/x-www-form-urlencoded\r\n";
$head .= "Content-Length: ".strlen(trim($query))."\r\n";
$head .= "\r\n";
$head .= trim($query);
$write = fwrite($fp, $head);
$data = "Referer: http://".$host.$path."\r\n";
info_log("sock_post send start host2=".$write."--".$data."--".$query, "notify");
usleep(200000);
$line = "";
fclose($fp);
while (!feof($fp)) {
$line = $line.fread($fp,4096);
}
fclose($fp);
return $line;
}
返回值
上一篇: PHP图片描边字与马赛克(示例)
下一篇: 前端异步流程工具