欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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通过fsockopen实现异步请求方法