fsockopen 实现异步请求
程序员文章站
2022-03-09 23:31:33
...
fsockopen() 函数以 Socket 模拟 HTTP 协议,作用是可以用来打开一个socket连接,可以进行类似真实的http操作,可用于向一个或者多个用户发送多条模板消息等场景。
一、开启 fsockopen 函数
第一步,打开PHP配置文件php.ini,查找 allow_url_fopen ,将其设置为 on;
第二部,查找 extension=php_openssl.dll, 去掉前边的分号 ‘;’;
第三部,如果是IIS 就重启IIS,如果是apache 就重启apache。
二、代码实现(TP5.0框架下)
首先是发送多条微信模板消息的代码(大致逻辑):
public function sendMessage()
{
ignore_user_abort(true);
set_time_limit(0);
//以下为大致逻辑(不完整)
$msg = $_POST; //POST传参
$message = getMessage($msg); //获取消息内容
for($a=0;$a<count($message);$a++) {
$params = getParam; //拼装发送消息的参数
$json_params = json_encode($params);
$url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='.$access_token;
self::https_request($url, urldecode($json_params));
sleep(3); //给微信接口足够的响应时间
}
//异步请求不打印报错信息,将相关信息写入文件内便于调试
//file_put_contents('./app/home/controller/A.txt',date('Y-m-d H:i:s',time())."\n".json_encode($message)."\n",FILE_APPEND);die;
}
以上代码循环体内为了保证正常调用微信接口,使用了 sleep() 函数,正常的同步请求显然不能满足要求
以下代码封装 fsockopen(完整代码,实现异步就靠他了) ,一是建立一个一个socket连接,二是能够传参(POST)
public function doRequest($url, $param=array())
{
$urlInfo = parse_url($url);
$host = $urlInfo['host'];
$path = $urlInfo['path'];
$query = isset($param)? http_build_query($param) : '';
$port = 80;
$errno = 0;
$errstr = '';
$timeout = 60;
$fp = fsockopen($host, $port, $errno, $errstr, $timeout);
$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;
fputs($fp, $out);
fclose($fp);
}
接下来就是入口文件,用于设置参数调用 doRequest() 函数实现异步请求
public function message($param) {
$url = 'http://www.xxx.com/yyy/zzz/sendMessage';
$this->doRequest($url, $param);
}
上一篇: css如何设置body字体颜色
下一篇: python中“end=”是什么意思?
推荐阅读