设为首页 收藏本站
查看: 1077|回复: 0

[经验分享] PHP 兼容 Curl/Socket/Stream 的 HTTP 操作类

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-26 09:29:41 | 显示全部楼层 |阅读模式
DSC0000.gif DSC0001.gif 代码



<?php   
/************************************************************  
*  描述:HTTP操作类  
*  作者:heiyeluren  
*  创建:2009/12/13 04:43  
*  修改:2009/12/16 10:30  实现基本HTTP各种接口操作支持  
*  
************************************************************/  
/**  
* HTTP功能工厂方法类  
*  
* 调用示例代码:  
try {  
  $http = Http::factory('http://www.baidu.com', Http::TYPE_SOCK );  
  echo $http->get();   
  $http = Http::factory('http://127.0.0.1/test/i.php', Http::TYPE_SOCK );  
  echo $http->post('', array('user'=>'我们', 'nick'=>'ASSADF@#!32812989+-239%ASDF'), '', array('aa'=>'bb', 'cc'=>'dd'));  
} catch (Exception $e) {  
  echo $e->getMessage();  
}  
*/  
class Http   
{   
/**  
  * @var 使用 CURL  
  */  
const TYPE_CURL   = 1;   
/**  
  * @var 使用 Socket  
  */   
const TYPE_SOCK   = 2;   
/**  
  * @var 使用 Stream  
  */   
const TYPE_STREAM  = 3;   
/**  
  * 保证对象不被clone  
  */  
private function __clone() {}   
    /**  
  * 构造函数  
  */  
private function __construct() {}   
/**  
  * HTTP工厂操作方法  
  *  
  * @param string $url 需要访问的URL  
  * @param int $type 需要使用的HTTP类  
  * @return object  
  */  
public static function factory($url = '', $type = self::TYPE_SOCK){   
  if ($type == ''){   
   $type = self::TYPE_SOCK;   
  }   
  switch($type) {   
   case self::TYPE_CURL :   
    if (!function_exists('curl_init')){   
     throw new Exception(__CLASS__ . " PHP CURL extension not install");   
    }   
    $obj = Http_Curl::getInstance($url);   
    break;   
   case self::TYPE_SOCK :   
    if (!function_exists('fsockopen')){   
     throw new Exception(__CLASS__ . " PHP function fsockopen() not support");   
    }      
    $obj = Http_Sock::getInstance($url);   
    break;   
   case self::TYPE_STREAM :   
    if (!function_exists('stream_context_create')){   
     throw new Exception(__CLASS__ . " PHP Stream extension not install");   
    }      
    $obj = Http_Stream::getInstance($url);   
    break;   
   default:   
    throw new Exception("http access type $type not support");   
  }   
  return $obj;   
}   
/**  
  * 生成一个供Cookie或HTTP GET Query的字符串  
  *  
  * @param array $data 需要生产的数据数组,必须是 Name => Value 结构  
  * @param string $sep 两个变量值之间分割的字符,缺省是 &   
  * @return string 返回生成好的Cookie查询字符串  
  */  
public static function makeQuery($data, $sep = '&'){   
  $encoded = '';   
  while (list($k,$v) = each($data)) {   
   $encoded .= ($encoded ? "$sep" : "");   
   $encoded .= rawurlencode($k)."=".rawurlencode($v);   
  }   
  return $encoded;     
}   
}   
  
/**  
* 使用CURL 作为核心操作的HTTP访问类  
*  
* @desc CURL 以稳定、高效、移植性强作为很重要的HTTP协议访问客户端,必须在PHP中安装 CURL 扩展才能使用本功能  
*/  
class Http_Curl   
{   
/**  
  * @var object 对象单例  
  */  
static $_instance = NULL;   
/**  
  * @var string 需要发送的cookie信息  
  */  
private $cookies = '';   
/**  
  * @var array 需要发送的头信息  
  */  
private $header = array();   
/**  
  * @var string 需要访问的URL地址  
  */   
private $uri = '';   
/**  
  * @var array 需要发送的数据  
  */  
private $vars = array();   
/**  
  * 构造函数  
  *  
  * @param string $configFile 配置文件路径  
  */  
private function __construct($url){   
  $this->uri = $url;   
}   
/**  
  * 保证对象不被clone  
  */  
private function __clone() {}   
/**  
  * 获取对象唯一实例  
  *  
  * @param string $configFile 配置文件路径  
  * @return object 返回本对象实例  
  */  
public static function getInstance($url = ''){   
  if (!(self::$_instance instanceof self)){   
   self::$_instance = new self($url);   
  }   
  return self::$_instance;   
}   
/**  
  * 设置需要发送的HTTP头信息  
  *   
  * @param array/string 需要设置的头信息,可以是一个 类似 array('Host: example.com', 'Accept-Language: zh-cn') 的头信息数组  
  *       或单一的一条类似于 'Host: example.com' 头信息字符串  
  * @return void  
  */  
public function setHeader($header){   
  if (emptyempty($header)) {   
   return;   
  }   
  if (is_array($header)){   
   foreach ($header as $k => $v){   
    $this->header[] = is_numeric($k) ? trim($v) : (trim($k) .": ". trim($v));      
   }   
  } elseif (is_string($header)){   
   $this->header[] = $header;   
  }   
}   
/**  
  * 设置Cookie头信息  
  *   
  * 注意:本函数只能调用一次,下次调用会覆盖上一次的设置  
  *  
  * @param string/array 需要设置的Cookie信息,一个类似于 'name1=value1&name2=value2' 的Cookie字符串信息,  
  *         或者是一个 array('name1'=>'value1', 'name2'=>'value2') 的一维数组  
  * @return void  
  */  
public function setCookie($cookie){   
  if (emptyempty($cookie)) {   
   return;   
  }   
  if (is_array($cookie)){   
   $this->cookies = Http::makeQuery($cookie, ';');   
  } elseif (is_string($cookie)){   
   $this->cookies = $cookie;   
  }   
}   
/**  
  * 设置要发送的数据信息  
  *  
  * 注意:本函数只能调用一次,下次调用会覆盖上一次的设置  
  *  
  * @param array 设置需要发送的数据信息,一个类似于 array('name1'=>'value1', 'name2'=>'value2') 的一维数组  
  * @return void  
  */  
public function setVar($vars){   
  if (emptyempty($vars)) {   
   return;   
  }   
  if (is_array($vars)){   
   $this->vars = $vars;   
  }   
}   
/**  
  * 设置要请求的URL地址  
  *  
  * @param string $url 需要设置的URL地址  
  * @return void  
  */  
public function setUrl($url){   
  if ($url != '') {   
   $this->uri = $url;   
  }   
}   
/**  
  * 发送HTTP GET请求  
  *  
  * @param string $url 如果初始化对象的时候没有设置或者要设置不同的访问URL,可以传本参数  
  * @param array $vars 需要单独返送的GET变量  
  * @param array/string 需要设置的头信息,可以是一个 类似 array('Host: example.com', 'Accept-Language: zh-cn') 的头信息数组  
  *         或单一的一条类似于 'Host: example.com' 头信息字符串  
  * @param string/array 需要设置的Cookie信息,一个类似于 'name1=value1&name2=value2' 的Cookie字符串信息,  
  *         或者是一个 array('name1'=>'value1', 'name2'=>'value2') 的一维数组  
  * @param int $timeout 连接对方服务器访问超时时间,单位为秒  
  * @param array $options 当前操作类一些特殊的属性设置  
  * @return unknown  
  */  
public function get($url = '', $vars = array(), $header = array(), $cookie = '', $timeout = 5, $options = array()){   
  $this->setUrl($url);   
  $this->setHeader($header);   
  $this->setCookie($cookie);   
  $this->setVar($vars);   
  return $this->send('GET', $timeout);   
}   
/**  
  * 发送HTTP POST请求  
  *  
  * @param string $url 如果初始化对象的时候没有设置或者要设置不同的访问URL,可以传本参数  
  * @param array $vars 需要单独返送的GET变量  
  * @param array/string 需要设置的头信息,可以是一个 类似 array('Host: example.com', 'Accept-Language: zh-cn') 的头信息数组  
  *         或单一的一条类似于 'Host: example.com' 头信息字符串  
  * @param string/array 需要设置的Cookie信息,一个类似于 'name1=value1&name2=value2' 的Cookie字符串信息,  
  *         或者是一个 array('name1'=>'value1', 'name2'=>'value2') 的一维数组  
  * @param int $timeout 连接对方服务器访问超时时间,单位为秒  
  * @param array $options 当前操作类一些特殊的属性设置  
  * @return unknown  
  */  
public function post($url = '', $vars = array(), $header = array(), $cookie = '', $timeout = 5, $options = array()){   
  $this->setUrl($url);   
  $this->setHeader($header);   
  $this->setCookie($cookie);   
  $this->setVar($vars);   
  return $this->send('POST', $timeout);   
}     
/**  
  * 发送HTTP请求核心函数  
  *  
  * @param string $method 使用GET还是POST方式访问  
  * @param array $vars 需要另外附加发送的GET/POST数据  
  * @param int $timeout 连接对方服务器访问超时时间,单位为秒  
  * @param array $options 当前操作类一些特殊的属性设置  
  * @return string 返回服务器端读取的返回数据  
  */  
public function send($method = 'GET', $timeout = 5, $options = array()){   
  //处理参数是否为空   
  if ($this->uri == ''){   
   throw new Exception(__CLASS__ .": Access url is empty");   
  }   
  //初始化CURL   
        $ch = curl_init();   
        curl_setopt($ch, CURLOPT_HEADER, 0);   
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);   
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);   
        //设置特殊属性   
        if (!emptyempty($options)){   
         curl_setopt_array($ch , $options);   
        }           
        //处理GET请求参数   
        if ($method == 'GET' && !emptyempty($this->vars)){   
         $query = Http::makeQuery($this->vars);   
         $parse = parse_url($this->uri);   
         $sep = isset($parse['query'])  ?  '&'  : '?';   
         $this->uri .= $sep . $query;   
        }   
        //处理POST请求数据   
        if ($method == 'POST'){   
            curl_setopt($ch, CURLOPT_POST, 1 );   
            curl_setopt($ch, CURLOPT_POSTFIELDS, $this->vars);   
        }   
        //设置cookie信息   
        if (!emptyempty($this->cookies)){   
            curl_setopt($ch, CURLOPT_COOKIE, $this->cookies);   
        }   
        //设置HTTP缺省头   
        if (emptyempty($this->header)){   
         $this->header = array(   
          'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)',   
          //'Accept-Language: zh-cn',            
          //'Cache-Control: no-cache',   
         );   
        }   
        curl_setopt($ch, CURLOPT_HTTPHEADER, $this->header);   
        //发送请求读取输数据   
        curl_setopt($ch, CURLOPT_URL, $this->uri);           
        $data = curl_exec($ch);   
        if( ($err = curl_error($ch)) ){   
            curl_close($ch);   
   throw new  Exception(__CLASS__ ." error: ". $err);   
        }   
        curl_close($ch);   
        return $data;   
}   
}   
  
/**  
* 使用 Socket操作(fsockopen) 作为核心操作的HTTP访问接口  
*  
* @desc Network/fsockopen 是PHP内置的一个Sokcet网络访问接口,必须安装/打开 fsockopen 函数本类才能工作,  
*    同时确保其他相关网络环境和配置是正确的  
*/  
class Http_Sock   
{   
/**  
  * @var object 对象单例  
  */  
static $_instance = NULL;   
/**  
  * @var string 需要发送的cookie信息  
  */  
private $cookies = '';   
/**  
  * @var array 需要发送的头信息  
  */  
private $header = array();   
/**  
  * @var string 需要访问的URL地址  
  */   
private $uri = '';   
/**  
  * @var array 需要发送的数据  
  */  
private $vars = array();   
/**  
  * 构造函数  
  *  
  * @param string $configFile 配置文件路径  
  */  
private function __construct($url){   
  $this->uri = $url;   
}   
/**  
  * 保证对象不被clone  
  */  
private function __clone() {}   
/**  
  * 获取对象唯一实例  
  *  
  * @param string $configFile 配置文件路径  
  * @return object 返回本对象实例  
  */  
public static function getInstance($url = ''){   
  if (!(self::$_instance instanceof self)){   
   self::$_instance = new self($url);   
  }   
  return self::$_instance;   
}   
/**  
  * 设置需要发送的HTTP头信息  
  *   
  * @param array/string 需要设置的头信息,可以是一个 类似 array('Host: example.com', 'Accept-Language: zh-cn') 的头信息数组  
  *       或单一的一条类似于 'Host: example.com' 头信息字符串  
  * @return void  
  */  
public function setHeader($header){   
  if (emptyempty($header)) {   
   return;   
  }   
  if (is_array($header)){   
   foreach ($header as $k => $v){   
    $this->header[] = is_numeric($k) ? trim($v) : (trim($k) .": ". trim($v));      
   }   
  } elseif (is_string($header)){   
   $this->header[] = $header;   
  }   
}   
/**  
  * 设置Cookie头信息  
  *   
  * 注意:本函数只能调用一次,下次调用会覆盖上一次的设置  
  *  
  * @param string/array 需要设置的Cookie信息,一个类似于 'name1=value1&name2=value2' 的Cookie字符串信息,  
  *         或者是一个 array('name1'=>'value1', 'name2'=>'value2') 的一维数组  
  * @return void  
  */  
public function setCookie($cookie){   
  if (emptyempty($cookie)) {   
   return;   
  }   
  if (is_array($cookie)){   
   $this->cookies = Http::makeQuery($cookie, ';');   
  } elseif (is_string($cookie)){   
   $this->cookies = $cookie;   
  }   
}   
/**  
  * 设置要发送的数据信息  
  *  
  * 注意:本函数只能调用一次,下次调用会覆盖上一次的设置  
  *  
  * @param array 设置需要发送的数据信息,一个类似于 array('name1'=>'value1', 'name2'=>'value2') 的一维数组  
  * @return void  
  */  
public function setVar($vars){   
  if (emptyempty($vars)) {   
   return;   
  }   
  if (is_array($vars)){   
   $this->vars = $vars;   
  }   
}   
/**  
  * 设置要请求的URL地址  
  *  
  * @param string $url 需要设置的URL地址  
  * @return void  
  */  
public function setUrl($url){   
  if ($url != '') {   
   $this->uri = $url;   
  }   
}   
/**  
  * 发送HTTP GET请求  
  *  
  * @param string $url 如果初始化对象的时候没有设置或者要设置不同的访问URL,可以传本参数  
  * @param array $vars 需要单独返送的GET变量  
  * @param array/string 需要设置的头信息,可以是一个 类似 array('Host: example.com', 'Accept-Language: zh-cn') 的头信息数组  
  *         或单一的一条类似于 'Host: example.com' 头信息字符串  
  * @param string/array 需要设置的Cookie信息,一个类似于 'name1=value1&name2=value2' 的Cookie字符串信息,  
  *         或者是一个 array('name1'=>'value1', 'name2'=>'value2') 的一维数组  
  * @param int $timeout 连接对方服务器访问超时时间,单位为秒  
  * @param array $options 当前操作类一些特殊的属性设置  
  * @return unknown  
  */  
public function get($url = '', $vars = array(), $header = array(), $cookie = '', $timeout = 5, $options = array()){   
  $this->setUrl($url);   
  $this->setHeader($header);   
  $this->setCookie($cookie);   
  $this->setVar($vars);   
  return $this->send('GET', $timeout);   
}   
/**  
  * 发送HTTP POST请求  
  *  
  * @param string $url 如果初始化对象的时候没有设置或者要设置不同的访问URL,可以传本参数  
  * @param array $vars 需要单独返送的GET变量  
  * @param array/string 需要设置的头信息,可以是一个 类似 array('Host: example.com', 'Accept-Language: zh-cn') 的头信息数组  
  *         或单一的一条类似于 'Host: example.com' 头信息字符串  
  * @param string/array 需要设置的Cookie信息,一个类似于 'name1=value1&name2=value2' 的Cookie字符串信息,  
  *         或者是一个 array('name1'=>'value1', 'name2'=>'value2') 的一维数组  
  * @param int $timeout 连接对方服务器访问超时时间,单位为秒  
  * @param array $options 当前操作类一些特殊的属性设置  
  * @return unknown  
  */  
public function post($url = '', $vars = array(), $header = array(), $cookie = '', $timeout = 5, $options = array()){   
  $this->setUrl($url);   
  $this->setHeader($header);   
  $this->setCookie($cookie);   
  $this->setVar($vars);   
  return $this->send('POST', $timeout);   
}     
/**  
  * 发送HTTP请求核心函数  
  *  
  * @param string $method 使用GET还是POST方式访问  
  * @param array $vars 需要另外附加发送的GET/POST数据  
  * @param int $timeout 连接对方服务器访问超时时间,单位为秒  
  * @param array $options 当前操作类一些特殊的属性设置  
  * @return string 返回服务器端读取的返回数据  
  */  
public function send($method = 'GET', $timeout = 5, $options = array()){   
  //处理参数是否为空   
  if ($this->uri == ''){   
   throw new Exception(__CLASS__ .": Access url is empty");   
  }   
        //处理GET请求参数   
        if ($method == 'GET' && !emptyempty($this->vars)){   
         $query = Http::makeQuery($this->vars);   
         $parse = parse_url($this->uri);   
         $sep = isset($parse['query'])&&($parse['query']!='')  ?  '&'  : '?';   
         $this->uri .= $sep . $query;   
        }   
        //处理POST请求数据   
        $data = '';   
        if ($method == 'POST' && !emptyempty($this->vars)){   
         $data = Http::makeQuery($this->vars);   
          $this->setHeader('Content-Type: application/x-www-form-urlencoded');     
         $this->setHeader('Content-Length: '. strlen($data));   
        }   
  //解析URL地址   
  $url = parse_url($this->uri);   
  $host = $url['host'];   
  $port = isset($url['port']) && ($url['port']!='') ? $url['port'] : 80;   
  $path = isset($url['path']) && ($url['path']!='') ? $url['path'] : '/';   
  $path .= isset($url['query']) ? "?". $url['query'] : '';   
  //组织HTTP请求头信息   
  array_unshift(&$this->header, $method ." ". $path ." HTTP/1.1");   
        $this->setHeader('User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)');   
  if (!preg_match("/^[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}$/", $host)){   
   $this->setHeader("Host: ".$host);   
  }   
  if ($this->cookies != ''){   
   $this->setHeader("Cookie: ". $this->cookies);   
  }   
  $this->setHeader("Connection: Close");   
  //'Accept-Language: zh-cn',   
     //'Cache-Control: no-cache',   
     //构造请求信息   
     $header = '';   
  foreach ($this->header as $h) {   
   $header .= $h ."\r\n";   
  }   
  $header .= "\r\n";   
  if ($method == 'POST' && $data != ''){   
   $header .= $data ."\r\n";   
  }   
  //连接服务器发送请求数据   
  $ip = gethostbyname($host);   
  if (!($fp = fsockopen($ip, $port, &$errno, &$errstr, $timeout))){   
   throw new Exception(__CLASS__ .": Can't connect $host:$port, errno:$errno,message:$errstr");   
  }   
  fputs($fp, $header);   
  $lineSize = 1024;     
  //处理301,302跳转页面访问   
  $line = fgets($fp, $lineSize);   
  $first = preg_split("/\s/", trim($line));   
  if ( isset($first[1]) && in_array($first[1], array('301','302')) ){   
   while (!feof($fp)) {      
    $line = fgets($fp, $lineSize);   
    $second = preg_split("/\s/", trim($line));   
    if (ucfirst(trim($second[0]))=='Location:' && $second[1]!=''){   
     $this->header = array();   
     return $this->get(trim($second[1]));   
    }   
   }   
  }   
  //正常读取返回数据     
  $buf = '';   
  $inheader = 1;   
  while (!feof($fp)) {   
   if ($inheader && ($line == "\n" || $line == "\r\n")) {   
     $inheader = 0;   
   }      
   $line = fgets($fp, $lineSize);   
   if ($inheader == 0) {   
    $buf .=$line;   
   }   
  }   
  fclose($fp);   
  return $buf;   
}   
}   
  
/**  
* 使用文件流操作函数为核心操作的HTTP访问接口  
*  
* @desc stream_* 和 fopen/file_get_contents 是PHP内置的一个流和文件操作接口,必须打开 fsockopen 函数本类才能工作,  
*    同时确保其他相关网络环境和配置是正确的,包括 allow_url_fopen 等设置  
*/  
class Http_Stream   
{   
  /**  
  * @var object 对象单例  
  */  
static $_instance = NULL;   
/**  
  * @var string 需要发送的cookie信息  
  */  
private $cookies = '';   
/**  
  * @var array 需要发送的头信息  
  */  
private $header = array();   
/**  
  * @var string 需要访问的URL地址  
  */   
private $uri = '';   
/**  
  * @var array 需要发送的数据  
  */  
private $vars = array();   
/**  
  * 构造函数  
  *  
  * @param string $configFile 配置文件路径  
  */  
private function __construct($url){   
  $this->uri = $url;   
}   
/**  
  * 保证对象不被clone  
  */  
private function __clone() {}   
/**  
  * 获取对象唯一实例  
  *  
  * @param string $configFile 配置文件路径  
  * @return object 返回本对象实例  
  */  
public static function getInstance($url = ''){   
  if (!(self::$_instance instanceof self)){   
   self::$_instance = new self($url);   
  }   
  return self::$_instance;   
}   
/**  
  * 设置需要发送的HTTP头信息  
  *   
  * @param array/string 需要设置的头信息,可以是一个 类似 array('Host: example.com', 'Accept-Language: zh-cn') 的头信息数组  
  *       或单一的一条类似于 'Host: example.com' 头信息字符串  
  * @return void  
  */  
public function setHeader($header){   
  if (emptyempty($header)) {   
   return;   
  }   
  if (is_array($header)){   
   foreach ($header as $k => $v){   
    $this->header[] = is_numeric($k) ? trim($v) : (trim($k) .": ". trim($v));      
   }   
  } elseif (is_string($header)){   
   $this->header[] = $header;   
  }   
}   
/**  
  * 设置Cookie头信息  
  *   
  * 注意:本函数只能调用一次,下次调用会覆盖上一次的设置  
  *  
  * @param string/array 需要设置的Cookie信息,一个类似于 'name1=value1&name2=value2' 的Cookie字符串信息,  
  *         或者是一个 array('name1'=>'value1', 'name2'=>'value2') 的一维数组  
  * @return void  
  */  
public function setCookie($cookie){   
  if (emptyempty($cookie)) {   
   return;   
  }   
  if (is_array($cookie)){   
   $this->cookies = Http::makeQuery($cookie, ';');   
  } elseif (is_string($cookie)){   
   $this->cookies = $cookie;   
  }   
}   
/**  
  * 设置要发送的数据信息  
  *  
  * 注意:本函数只能调用一次,下次调用会覆盖上一次的设置  
  *  
  * @param array 设置需要发送的数据信息,一个类似于 array('name1'=>'value1', 'name2'=>'value2') 的一维数组  
  * @return void  
  */  
public function setVar($vars){   
  if (emptyempty($vars)) {   
   return;   
  }   
  if (is_array($vars)){   
   $this->vars = $vars;   
  }   
}   
/**  
  * 设置要请求的URL地址  
  *  
  * @param string $url 需要设置的URL地址  
  * @return void  
  */  
public function setUrl($url){   
  if ($url != '') {   
   $this->uri = $url;   
  }   
}   
/**  
  * 发送HTTP GET请求  
  *  
  * @param string $url 如果初始化对象的时候没有设置或者要设置不同的访问URL,可以传本参数  
  * @param array $vars 需要单独返送的GET变量  
  * @param array/string 需要设置的头信息,可以是一个 类似 array('Host: example.com', 'Accept-Language: zh-cn') 的头信息数组  
  *         或单一的一条类似于 'Host: example.com' 头信息字符串  
  * @param string/array 需要设置的Cookie信息,一个类似于 'name1=value1&name2=value2' 的Cookie字符串信息,  
  *         或者是一个 array('name1'=>'value1', 'name2'=>'value2') 的一维数组  
  * @param int $timeout 连接对方服务器访问超时时间,单位为秒  
  * @param array $options 当前操作类一些特殊的属性设置  
  * @return unknown  
  */  
public function get($url = '', $vars = array(), $header = array(), $cookie = '', $timeout = 5, $options = array()){   
  $this->setUrl($url);   
  $this->setHeader($header);   
  $this->setCookie($cookie);   
  $this->setVar($vars);   
  return $this->send('GET', $timeout);   
}   
/**  
  * 发送HTTP POST请求  
  *  
  * @param string $url 如果初始化对象的时候没有设置或者要设置不同的访问URL,可以传本参数  
  * @param array $vars 需要单独返送的GET变量  
  * @param array/string 需要设置的头信息,可以是一个 类似 array('Host: example.com', 'Accept-Language: zh-cn') 的头信息数组  
  *         或单一的一条类似于 'Host: example.com' 头信息字符串  
  * @param string/array 需要设置的Cookie信息,一个类似于 'name1=value1&name2=value2' 的Cookie字符串信息,  
  *         或者是一个 array('name1'=>'value1', 'name2'=>'value2') 的一维数组  
  * @param int $timeout 连接对方服务器访问超时时间,单位为秒  
  * @param array $options 当前操作类一些特殊的属性设置  
  * @return unknown  
  */  
public function post($url = '', $vars = array(), $header = array(), $cookie = '', $timeout = 5, $options = array()){   
  $this->setUrl($url);   
  $this->setHeader($header);   
  $this->setCookie($cookie);   
  $this->setVar($vars);   
  return $this->send('POST', $timeout);   
}     
/**  
  * 发送HTTP请求核心函数  
  *  
  * @param string $method 使用GET还是POST方式访问  
  * @param array $vars 需要另外附加发送的GET/POST数据  
  * @param int $timeout 连接对方服务器访问超时时间,单位为秒  
  * @param array $options 当前操作类一些特殊的属性设置  
  * @return string 返回服务器端读取的返回数据  
  */  
public function send($method = 'GET', $timeout = 5, $options = array()){   
  //处理参数是否为空   
  if ($this->uri == ''){   
   throw new Exception(__CLASS__ .": Access url is empty");   
  }   
  $parse = parse_url($this->uri);   
  $host = $parse['host'];   
        //处理GET请求参数   
        if ($method == 'GET' && !emptyempty($this->vars)){   
         $query = Http::makeQuery($this->vars);   
         $sep = isset($parse['query'])&&($parse['query']!='')  ?  '&'  : '?';   
         $this->uri .= $sep . $query;   
        }   
        //处理POST请求数据   
        $data = '';   
        if ($method == 'POST' && !emptyempty($this->vars)){   
         $data = Http::makeQuery($this->vars);   
        }   
        //设置缺省头   
        $this->setHeader('User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)');   
  if (!preg_match("/^[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}$/", $host)){   
   $this->setHeader("Host: ".$host);   
  }   
  if ($this->cookies != ''){   
   $this->setHeader("Cookie: ". $this->cookies);   
  }   
  $this->setHeader("Connection: Close");   
  //'Accept-Language: zh-cn',   
     //'Cache-Control: no-cache',           
        //构造头信息   
        $opts = array(   
         'http' => array(   
          'method'   => $method,   
          'timeout'  => $timeout,   
         )   
        );   
        if ($data != ''){   
         $opts['http']['content'] = $data;   
        }   
        $opts['http']['header'] = '';   
        foreach ($this->header as $h){   
         $opts['http']['header'] .= $h . "\r\n";   
        }   
        //print_r($opts);exit;   
        //读取扩展设置选项   
        if (!emptyempty($options)){   
         isset($options['proxy']) ? $opts['http']['proxy'] = $options['proxy'] : '';            
         isset($options['max_redirects']) ? $opts['http']['max_redirects'] = $options['max_redirects'] : '';   
         isset($options['request_fulluri']) ? $opts['http']['request_fulluri'] = $options['request_fulluri'] : '';   
        }   
        //发送数据返回   
       $context = stream_context_create($opts);   
       if (($buf = file_get_contents($this->uri, null, $context)) === false){   
   throw new Exception(__CLASS__ .": file_get_contents(". $this->uri .") fail");   
       }   
       return $buf;     
}   
}   

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-104332-1-1.html 上篇帖子: Des加密算法的PHP实现 下篇帖子: 【转载】一个老程序员和学生对作为PHP程序员的你们说的话
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表