用socket实现的PHP的http类

来源:互联网 发布:java rpc框架对比 编辑:程序博客网 时间:2024/05/18 03:47

//用php写一个服务器端的http类

//File:Http.class.php

//Author: lijunjie

//Date: 2007-08-05

//E-mail:lijunjie1982@yahoo.com.cn

//修改历史:

//1. 2007-09-21对参数里的名字也进行了编码

//2. 2007-9-22对参数的编码的算法进行了纠正和简化

//3. 2007-10-11规范了书写的格式,添加了几个方法

//4. 2007-10-13允许添加请求头信息和输出相应头信息,修改了post和get的调用方法,

//现在只返回true|false,相应内容通过其它方法得到,这样基本可以不用is_error方法了.

//由于此修改该版本无法与以前版本兼容,故又添加了获取版本号的方法,目前版本定为1.1.0

//5. 2007-10-17 修改了addGetParam中的一个bug从 $this->_url .= strpos($this->_url,'?') == -1?'?':'&'; 到$this->_url .= strpos($this->_url,'?') ===false?'?':'&';

//6. 2007-11-7 将 $this->_port =isset($arr_url['port'])?$arr_url['port']:'80'; 修改成 $this->_port= isset($arr_url['port'])?$arr_url['port']:'80';避免一个notice 


class Http {

    private$_url =''; //请求资源的地址

    private$_params = '';//post参数字符串

    private$_headers = '';//header参数字符串


    private$_host =''; //主机

    private$_port =''; //端口号

    private$_path =''; //资源路径

    private$_query = '';//查询字符串

    private$_time_out = 10;//请求超时时间(单位:s)


    private$_response = array();//相应信息


    private$_version = "Http_classv1.1.0 \ncopyright@lijunjie";

    public$err_no = '';//错误代码

    public$err_str = '';//错误描述


    
    publicfunction Http($url= ''){
        $this->_url= $url;
    }
    
    publicfunction setURL($url= ''){
        $this->_url= $url;
    }
    
    publicfunction setTimeOut($timeout = 10){
        $this->_time_out= $timeout;
    }
    
    publicfunction clear(){
        $this->_url= "";
        $this->_params= "";
        $this->_headers= "";
        $this->err_no= "";
        $this->err_str= "";
    }
    
    publicfunction addHeader($str_header) {
        $this->_headers.= $str_header ."\n";
    }
    
    publicfunction setHeader($str_header) {
        $this->_headers= $str_header ."\n";
    }
    
    publicfunctionaddGetParam($arrParam) {
        $this->_url.= strpos($this->_url,'?')===false?'?':'&';
        $this->_url.= http_build_query($arrParam);
    }
    
    publicfunctionaddPostParam($arrParam) {
        $this->_params.= strlen($this->_params) >0?'&':'';
        $this->_params.= http_build_query($arrParam);
    }
    
    publicfunctionsetPostParam($arrParam) {
        $this->_params= http_build_query($arrParam);
    }
    
    publicfunction get(){
        return$this->_request("GET");
    }
    
    publicfunction post(){
        return$this->_request("POST");
    }
    
    publicfunctiongetResponse($item= ""){
        return$item ==""?$this->_response:$this->_response[$item];
    }
    
    publicfunction getContent(){
        return$this->_response['content'];
    }
    
    publicfunction getVersion(){
        return$this->_version;
    }
    
    publicfunction is_error(){
        return$this->err_no;
    }
    
    publicfunction get_error(){
        return$this->err_str;
    }

    //=====私有方法=====

    privatefunction _parse_url(){
        $arr_url= parse_url($this->_url);
        if(!is_array($arr_url)){
            $arr_url= array();
        }
        $this->_host= $arr_url['host'];
        $this->_port= isset($arr_url['port'])?$arr_url['port']:'80';
        $this->_path= $arr_url['path'];
        $this->_query= $arr_url['query'];
    }
    
    privatefunction _request($method= "GET"){
        $this->_parse_url();
        $fp= @fsockopen($this->_host,$this->_port,$this->err_no,$this->err_str,$this->_time_out);

        if(!$fp){
            returnfalse;
        }else{
            $request= '';
            $request.= sprintf("%s %s%s%sHTTP/1.0\n",$method,$this->_path, $this->_query ? "?": "",$this->_query);
            $request.= "Host:".$this->_host."\n";
            $request.= $this->_headers;
            $request.= $method== "POST"?"Content-type:application/x-www-form-urlencoded\n":"";
            $request.= $method== "POST"?"Content-length: ". strlen($this->_params) ."\n":"";
            $request.= "Connection:close\n"; //这里还不太理解

            $request.= $method== "POST"?"\n$this->_params\n":"";//注意是两次回车后写数据的

            $request.= "\n";
            //echo$request;//exit;

            fputs($fp,$request);
            //获得请求后返回的内容


            $results= "";

            while(!feof($fp)){
                $line= fgets($fp,1024);
                $results.= $line;
            }
            fclose($fp);
            $this->_response['header']= substr($results,0,strpos($results,"\r\n\r\n")+1);//相应的头信息

            $this->_response['content']= substr($results,strpos($results,"\r\n\r\n")+4);//去掉请求返回的头部

            returntrue;
        }
    }
}


原创粉丝点击