fsockopen 实现异步请求

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);	
  } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章