搜尋
首頁php教程php手册HttpClient 增强版
HttpClient 增强版Jun 06, 2016 pm 07:37 PM
301302httpclient增加增強提示更新

更新提示: 1.增加301、302HTTP重定向 2.增加自定义发送头部 3.修复超时时间 4.增加HTTP_STATUS_CODE属性 5.支持HTTPS 来源地址:http://www.haowei.me/archives/1154.html 无 ?php class HttpClient { private static $context = null; // (resource) Socket

更新提示:

1. 增加 301、302 HTTP 重定向
2. 增加 自定义 发送头部
3. 修复 超时时间
4. 增加 HTTP_STATUS_CODE 属性
5. 支持 HTTPS

来源地址: http://www.haowei.me/archives/1154.html
<?php
 
class HttpClient {
       
    private static $context = null;         // (resource) Socket stream 
    private $header = null;                 // (array) Request headers
    private $headerList = null;             // (array) User custom request headers
    public $buffer = null;                  // (string) Call buffer
    public $response = null;                // (array) Remote response headers
    public $request = null;                 // (string) Request headers
    private $args = null;                   // (array) User configure
    private $attachRedirect = null;         // (bool) Tigger HTTP redirect 
       
    public function __construct($args  = null) {
           
        if(!is_array($args)) $args = array();
        $this->args = $args;
        $charset = isset($this->args['charset']) ?  $this->args['charset'] : 'UTF-8';
        if(!empty($this->args['debugging'])) {
   
            set_time_limit(0);
            header('Content-Type: text/plain;charset='. $charset);
   
        }else{
   
            header('Content-Type: text/html;charset='. $charset);
   
        }
           
        if(!isset($this->args['timeout'])) $this->args['timeout'] = 5;
        $this->args['timeout'] = intval($this->args['timeout']);
           
        if(!empty($this->args['redirect'])) $this->attachRedirect = true;
        $this->headerList = array();
           
    }
       
    public static function init(& $instanceof, $args = null) {
           
        static $instance;
        if(!$instance) $instanceof = new self($args);
        return $instance = $instanceof;
           
    }
       
    public function setHeader($name, $value) {
           
        $this->headerList[$name] = $value;
           
    }
     
    private function build($args) {
           
        list($method, $url, $data, $cookie) = $args;
         
		$this->buffer = '';
        $this->request = '';
        $this->header = array();
		$this->response = array();
        $userAgent = isset($this->args['userAgent']) ? $this->args['userAgent'] : ( isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : __CLASS__ );
        extract($parse = parse_url($url));
           
        $path = isset($query) ? $path .'?'. $query : ( isset($path) ? $path : '/' );
        $port = isset($port) ? $port : ( $scheme == 'https' ? 443 : 80 );
        $protocol = $scheme == 'https' ? 'ssl://' : 'tcp://';
           
        self::$context = fsockopen($protocol . $host, $port, $errno, $errstr, $this->args['timeout']);
        if($errno) trigger_error(iconv('GBK//IGNORE', 'UTF-8', $errstr), E_USER_ERROR);
           
        stream_set_blocking(self::$context, 1);
        stream_set_timeout(self::$context, $this->args['timeout']);
           
        $query = $data;
        if($data && is_array($data)) {
               
            $query = array();
            foreach($data as $k => $value)
            array_push($query, $k .'='. $value);
            $query = implode('&', $query);
               
        }
           
        array_push($this->header, $method .' '. $path .' HTTP/1.1');
        array_push($this->header, 'Host: '. $host);
        array_push($this->header, 'Accept: */*');
        array_push($this->header, 'Content-type: application/x-www-form-urlencoded');
        array_push($this->header, 'Connection: close');
        array_push($this->header, 'User-Agent: '. $userAgent);
           
        if($this->headerList)
        foreach($this->headerList as $name => $value)
        array_push($this->header, $name .': '. $value);
           
        if($cookie) array_push($this->header, 'Cookie: '. $cookie );
        if($data) array_push($this->header, 'Content-Length: '. strlen($query));
        if($data) array_push($this->header, '');
        if($data) array_push($this->header, $query);
        array_push($this->header, "\r\n");
   
        $this->request = implode("\r\n", $this->header);      
        fputs(self::$context, $this->request);
   
        $skipped = false;
        $this->HTTP_STATUS_CODE = 0;
        $this->HTTP_TRANSFER_CHUNKED = false;
           
        while(!feof(self::$context)) {
               
            if(($line = fgets(self::$context))) {
                   
                if(preg_match('/HTTP\/\d\.\d\s*(\d+)/i', $line, $match))
                $this->HTTP_STATUS_CODE = (int) array_pop($match);
             
                if(preg_match('/Location:\s*(.+)\s*?/i', $line, $match)) 
                ( ($this->HTTP_REDIRECT_URL = trim(array_pop($match))) && $skipped = !$skipped );
             
                if(preg_match('/Transfer\-Encoding:\s*chunked/i', $line, $match)) 
                $this->HTTP_TRANSFER_CHUNKED = true;
                if(array_push($this->response, $line) && in_array($line, array("\n", "\r\n"))) break;
                   
            }
               
        }
           
        if($this->attachRedirect && $skipped) {
               
            fclose(self::$context);
            $data ? call_user_func_array(array($this, $method), array($this->HTTP_REDIRECT_URL, $data, $cookie)):
            call_user_func_array(array($this, $method), array($this->HTTP_REDIRECT_URL, $cookie));
               
        }
         
         
        if(!$skipped) {
                           
            if($this->HTTP_STATUS_CODE === 200) {
                   
                $this->buffer = '';
                $chunksize = 0;
                $chunked = '';
                 
                while(!feof(self::$context)) {
                     
                    $line = fgets(self::$context);
                    if($this->HTTP_TRANSFER_CHUNKED) {
                         
                        if(!$chunksize) {
                             
                            $chunksize = (int) hexdec(trim(ltrim($line, '0'))) + 2;
                             
                        }else{
                             
                            if(strlen($chunked) < $chunksize){
                             
                                $chunked .= $line;
                             
                            }else{
                                 
                                $this->buffer .= substr($chunked, 0, $chunksize - 2);
                                $chunksize = (int) hexdec(trim(ltrim($line, '0'))) + 2;
                                $chunked = '';
                            }
                             
                        }
                         
                    }else{
                         
                        $this->buffer .= $line;
                     
                    }
                }
                   
                   
            }
               
        }
           
        return (string) $this->buffer;
           
    }
       
    public function get($url, $cookie = null) {
           
        return $this->build(array('GET', $url, null, $cookie));
           
    }
       
    public function post($url, $data = null, $cookie = null) {
           
        return $this->build(array('POST', $url, $data, $cookie));
           
    }
       
    public function __set($attr, $value) {
           
        $this->$attr = $value;
           
    }
       
    public function __destruct() {
           
        if(is_resource(self::$context)) fclose(self::$context);
        unset($this->headerList, $this->header, $this->response, $this->request, $this->args, $this->buffer);
           
    }
       
}


HttpClient::init($HttpClient, array('userAgent' => $_SERVER['HTTP_USER_AGENT'], 'redirect' => true));
$HttpClient->get('http://www.haowei.me');
echo $HttpClient->buffer;
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
win10系统频繁更新,如何解决提醒重启问题?win10系统频繁更新,如何解决提醒重启问题?Jun 30, 2023 pm 09:57 PM

win10电脑老是提醒更新重启怎么办?win10的更新问题一直是大家比较头疼的,无论是更新前还是更新后,系统老是提醒更新重启,十分烦人。其实我们只要将对应服务关闭就可以了,下面就一起来看看具体方法吧。win10电脑老是提醒更新重启解决办法一、更新前提示1、首先我们在开始菜单中打开设置。2、选择更新和安全。3、再点击高级选项。4、将更新通知关闭即可。二、更新后提醒1、其实我们在完成更新之后,系统也有可能会老是提醒我们重启。2、这时候我们需要先右键计算机,选择理3、在系统工具中找到图所示。4、然后我

如何使用golang中的http.Client进行HTTP请求的高级操作如何使用golang中的http.Client进行HTTP请求的高级操作Nov 18, 2023 am 11:37 AM

如何使用golang中的http.Client进行HTTP请求的高级操作引言:在现代开发中,HTTP请求是不可避免的一部分。golang提供了强大的标准库,其中包含了http包。http包提供了http.Client结构体,用于发送HTTP请求和接收HTTP响应。在本文中,我们将探讨如何使用http.Client进行HTTP请求的高级操作,并提供具体的代码示

使用Java 11中的HttpClient发送HTTP请求并处理响应使用Java 11中的HttpClient发送HTTP请求并处理响应Aug 01, 2023 am 11:48 AM

标题:使用Java11中的HttpClient发送HTTP请求并处理响应引言:在现代的互联网应用程序中,与其他服务器进行HTTP通信是非常常见的任务。Java提供了一些内置的工具,可以帮助我们实现这一目标,其中最新且推荐使用的是Java11中引入的HttpClient类。本文将介绍如何使用Java11中的HttpClient发送HTTP请求并处理响应,

如何在CakePHP中进行数据查询和更新?如何在CakePHP中进行数据查询和更新?Jun 03, 2023 pm 02:11 PM

CakePHP是一个流行的PHP框架,它提供了方便的ORM(对象关系映射)功能,使得查询和更新数据库变得非常容易。本文将介绍如何在CakePHP中进行数据查询和更新。我们将从简单的查询和更新开始,逐步深入,了解如何使用条件和关联的模型来更复杂地查询和更新数据。基本查询首先,让我们看看如何进行最简单的查询。假设我们有一个名为“Users”的数据表,并且我们想要

Vue中如何使用$forceUpdate强制更新组件Vue中如何使用$forceUpdate强制更新组件Jun 11, 2023 am 08:46 AM

Vue是一个流行的JavaScript框架,它通过使用组件化开发模式,使得我们可以轻松地构建可重用的交互式用户界面。但是某些情况下,我们需要手动更新组件而不是等待数据驱动更新,这时候可以使用Vue提供的$forceUpdate方法。在这篇文章中,我们将详细讨论Vue中如何使用$forceUpdate方法强制更新组件。Vue组件的渲染是由Vue的响应式系统驱动

Win11bios怎么更新Win11bios怎么更新Jun 29, 2023 pm 03:22 PM

  Win11bios怎么更新?更新BIOS可以支持最新的硬件,也可以对以往的一些硬件进行优化。近期有部分Win11用户想要更新BIOS,但是不太清楚应该如何操作,对于这一情况,下面小编为大家带来了详细的Win11更新bios的方法,我们一起来看看吧。  Win11更新bios的方法  在进行更新之前,您需要执行一些任务。首先,您需要检查您的BIOS版本并记下它。然后,您可以继续为您的特定系统下载正确的BIOS。  1、检查您的BIOS版本  同时按下Windows和R键。  键入msinfo3

如何使用Java中的httpclient进行重定向和请求转发的比较如何使用Java中的httpclient进行重定向和请求转发的比较Apr 21, 2023 pm 11:43 PM

这里介绍一下:HttpClient4.x版本,get请求方法会自动进行重定向,而post请求方法不会自动进行重定向,这是要注意的地方。我上次发生错误,就是使用post提交表单登录,当时没有自动重定向。请求转发和重定向的区别1、重定向是两次请求,转发是一次请求,因此转发的速度要快于重定向。2、重定向之后地址栏上的地址会发生变化,变化成第二次请求的地址,转发之后地址栏上的地址不会变化,还是第一次请求的地址。3、转发是服务器行为,重定向是客户端行为。重定向时浏览器上的网址改变,转发是浏览器上的网址不变

win10更新后无法开机怎么办win10更新后无法开机怎么办Jul 03, 2023 am 11:40 AM

win10更新后无法开机解决方法:1、通过“启动修复”进行自动修复;2、通过命令提示符检查和修复;3、进入安全模式以卸载Windows更新;4、使用命令提示符修复MBR;5、检查系统盘是否有坏扇区并进行修复;6、进行系统恢复。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)