zoukankan      html  css  js  c++  java
  • PHP 兼容 Curl/Socket/Stream 的 HTTP 操作类

    代码
    <?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;

    }


    }


  • 相关阅读:
    Codeforce 270A
    Codeforce 513A
    Codeforce 834A
    51Nod 1433 0和5
    51Nod 1005 大数加法
    51Nod 1136 欧拉函数
    51Nod 1449 砝码称重 (二进制思想)
    Codeforce 459A
    Codeforce 515A
    Codeforce 474A
  • 原文地址:https://www.cnblogs.com/softwaredevelop/p/1707018.html
Copyright © 2011-2022 走看看