fsockopen封装

admin 发表于 [PHP] 分类,标签: PHP代码 PHP自定义函数
0
/**
     *  post数据
     *  @param string $url        post的url
     *  @param int $limit        返回的数据的长度
     *  @param string $post        post数据,字符串形式username='admpub'&password='123456'
     *  @param string $cookie    模拟 cookie,字符串形式username='admpub'&password='123456'
     *  @param string $ip        ip地址
     *  @param int $timeout        连接超时时间
     *  @param bool $block        是否为阻塞模式
     *  @return string            返回字符串
     */
    
    function _fso($url, $limit = 0, $post = '', $cookie = '', $ip = '', $timeout = 15, $block = true) {
        $return = '';
        $matches = parse_url($url);
        $host = $matches['host'];
        $path = $matches['path'] ? $matches['path'].($matches['query'] ? '?'.$matches['query'] : '') : '/';
        $port = !empty($matches['port']) ? $matches['port'] : 80;
        $siteurl = $this->_get_url();
        if($post) {
            $out = "POST $path HTTP/1.1\r\n";
            $out .= "Accept: */*\r\n";
            $out .= "Referer: ".$siteurl."\r\n";
            $out .= "Accept-Language: zh-cn\r\n";
            $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
            $out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
            $out .= "Host: $host\r\n" ;
            $out .= 'Content-Length: '.strlen($post)."\r\n" ;
            $out .= "Connection: Close\r\n" ;
            $out .= "Cache-Control: no-cache\r\n" ;
            $out .= "Cookie: $cookie\r\n\r\n" ;
            $out .= $post ;
        } else {
            $out = "GET $path HTTP/1.1\r\n";
            $out .= "Accept: */*\r\n";
            $out .= "Referer: ".$siteurl."\r\n";
            $out .= "Accept-Language: zh-cn\r\n";
            $out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
            $out .= "Host: $host\r\n";
            $out .= "Connection: Close\r\n";
            $out .= "Cookie: $cookie\r\n\r\n";
        }
        $fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
        if(!$fp) return '';
    
        stream_set_blocking($fp, $block);
        stream_set_timeout($fp, $timeout);
        @fwrite($fp, $out);
        $status = stream_get_meta_data($fp);
    
        if($status['timed_out']) return '';    
        while (!feof($fp)) {
            if(($header = @fgets($fp)) && ($header == "\r\n" ||  $header == "\n"))  break;                
        }
        
        $stop = false;
        while(!feof($fp) && !$stop) {
            $data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
            $return .= $data;
            if($limit) {
                $limit -= strlen($data);
                $stop = $limit <= 0;
            }
        }
        @fclose($fp);
        
        //部分虚拟主机返回数值有误,暂不确定原因,过滤返回数据格式
        $return_arr = explode("\n", $return);
        if(isset($return_arr[1])) {
            $return = trim($return_arr[1]);
        }
        unset($return_arr);
        
        return $return;
    }

发表我的评论