php教程 php手册 HttpClient 增强版

HttpClient 增强版

Jun 06, 2016 pm 07:37 PM
301 302 httpclient 증가하다 향상시키다 힌트 고쳐 쓰다

更新提示: 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으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Google Chrome에서 이 탭의 콘텐츠가 공유되고 있다는 메시지가 표시되면 어떻게 해야 하나요? Google Chrome에서 이 탭의 콘텐츠가 공유되고 있다는 메시지가 표시되면 어떻게 해야 하나요? Mar 13, 2024 pm 05:00 PM

Google Chrome에서 이 탭의 콘텐츠가 공유되고 있다는 메시지가 표시되면 어떻게 해야 하나요? Google Chrome을 사용하여 새 탭을 열 때 가끔 이 탭의 콘텐츠가 공유되고 있다는 메시지가 표시됩니다. 무슨 일이 일어나고 있는 걸까요? 이 사이트는 이 탭의 콘텐츠가 공유되고 있다는 메시지를 표시하는 Google Chrome 문제에 대한 자세한 소개를 사용자에게 제공합니다. Google Chrome에서는 이 탭의 콘텐츠가 공유된다는 메시지를 표시합니다. 해결 방법: 1. Google Chrome을 엽니다. "Google Chrome 사용자 정의 및 제어" 아이콘을 클릭하면 변경됩니다. 아이콘. 2. 클릭하면 아래에 구글 크롬 메뉴창이 뜨고, 마우스가 '도구 더보기'로 이동합니다.

Blizzard Battle.net 업데이트가 45%에서 멈추는 문제를 해결하는 방법은 무엇입니까? Blizzard Battle.net 업데이트가 45%에서 멈추는 문제를 해결하는 방법은 무엇입니까? Mar 16, 2024 pm 06:52 PM

블리자드 Battle.net 업데이트가 45%에서 계속 멈춥니다. 어떻게 해결하나요? 최근 많은 사람들이 소프트웨어를 업데이트할 때 진행률이 45%에서 멈췄습니다. 여러 번 다시 시작해도 계속 멈춥니다. 그렇다면 이 상황을 해결하려면 어떻게 해야 할까요? 이 소프트웨어 튜토리얼은 더 많은 사람들에게 도움이 되기를 바라며 작업 단계를 공유할 것입니다. 블리자드 Battle.net 업데이트가 45%에서 계속 멈춥니다. 해결 방법 1. 클라이언트 1. 먼저 클라이언트가 공식 웹사이트에서 다운로드한 공식 버전인지 확인해야 합니다. 2. 그렇지 않은 경우 사용자는 아시아 서버 웹사이트에 들어가 다운로드할 수 있습니다. 3. 입력 후 오른쪽 상단의 다운로드를 클릭하세요. 참고: 설치할 때 중국어 간체를 선택하지 마십시오.

에픽세븐 2월 22일 업데이트: 미라클 메이드 왕국 2주차가 시작됩니다. 에픽세븐 2월 22일 업데이트: 미라클 메이드 왕국 2주차가 시작됩니다. Feb 21, 2024 pm 05:52 PM

에픽세븐은 2월 22일 낮 11시 지속적인 업데이트가 확정되었습니다. 이번 업데이트를 통해 레아의 한정 소환률 증가, 달콤한 미라클, 신비한 카드 풀 업데이트 등 다양한 신규 활동과 콘텐츠가 선보일 예정입니다. , 스페셜 서브 스토리 미라클 메이드 왕국의 두 번째 주가 시작되었습니다. 모바일 게임 업데이트 일정 : The Seventh Epic 2월 22일 업데이트 예정 : 미라클 메이드 왕국 2주차 오픈 ※'레이아' & '스위트 미라클' 한정 소환 확률 UP! ■기간 한정 소환 확률 업 시간 : -2024/02/22(목) 11:00 ~ 2024/03/07(목) 10:59 ■캐릭터 속성 및 직업 : 타고난 속성, 전사 ■캐릭터 소개 : 4인 밴드 더 기적의 메이드 왕국'의 서브보컬이자 베이(Bei)

Ubuntu 24.04에 Angular를 설치하는 방법 Ubuntu 24.04에 Angular를 설치하는 방법 Mar 23, 2024 pm 12:20 PM

Angular.js는 동적 애플리케이션을 만들기 위해 자유롭게 액세스할 수 있는 JavaScript 플랫폼입니다. HTML 구문을 템플릿 언어로 확장하여 애플리케이션의 다양한 측면을 빠르고 명확하게 표현할 수 있습니다. Angular.js는 코드를 작성, 업데이트 및 테스트하는 데 도움이 되는 다양한 도구를 제공합니다. 또한 라우팅 및 양식 관리와 같은 많은 기능을 제공합니다. 이 가이드에서는 Ubuntu24에 Angular를 설치하는 방법에 대해 설명합니다. 먼저 Node.js를 설치해야 합니다. Node.js는 서버 측에서 JavaScript 코드를 실행할 수 있게 해주는 ChromeV8 엔진 기반의 JavaScript 실행 환경입니다. Ub에 있으려면

랜턴과 던전 2월 29일 업데이트 : 리마스터 버전 ╳ '네자 전설' 연계 랜턴과 던전 2월 29일 업데이트 : 리마스터 버전 ╳ '네자 전설' 연계 Feb 28, 2024 am 08:13 AM

랜턴앤던전스는 2월 29일 업데이트가 확정되었으며, 업데이트 이후 랜턴앤던전스의 리마스터 버전이 출시될 예정이며, 리마스터 버전 역시 레전드 오브 나타와 연동될 예정이다. 직업 변경, 플레이어 직접 직업 변경, 던전 콘텐츠 확장, 새로운 던전 지역 오픈 등이 가능합니다. 모바일게임 업데이트 일정 랜턴과 던전 2월 29일 업데이트 : 리마스터 버전 ╳ '네자전설' ​​연계버전 주요 내용 신규 직업, 전직을 권유받은 이유는 무엇입니까? . 전직 후 랜턴 홀더도 멋진 기술을 많이 배울 수 있다고 들었습니다. 고로는 태국 바지가 뜨겁습니다! 나타의 전설이 함께 온다! 뜨거운 바퀴를 밟고 천지의 원을 손에 쥐고 ♫ ~ 현명하고 용감한 작은 영웅 나타와 어린 용 소녀가 곧 온다

MSI 그래픽 카드 드라이버를 업데이트하는 방법은 무엇입니까? MSI 그래픽 카드 드라이버 다운로드 및 설치 단계 MSI 그래픽 카드 드라이버를 업데이트하는 방법은 무엇입니까? MSI 그래픽 카드 드라이버 다운로드 및 설치 단계 Mar 13, 2024 pm 08:49 PM

MSI 그래픽 카드는 시장의 주류 그래픽 카드 브랜드입니다. 우리는 그래픽 카드가 성능을 달성하고 호환성을 보장하려면 드라이버를 설치해야 한다는 것을 알고 있습니다. 그렇다면 MSI 그래픽 카드 드라이버를 최신 버전으로 업데이트하는 방법은 무엇입니까? 일반적으로 MSI 그래픽 카드 드라이버는 공식 웹사이트에서 다운로드하여 설치할 수 있습니다. 자세한 내용은 아래에서 알아보세요. 그래픽 카드 드라이버 업데이트 방법: 1. 먼저 "MSI 공식 웹사이트"에 들어갑니다. 2. 입력 후 오른쪽 상단의 "검색" 버튼을 클릭하여 그래픽 카드 모델을 입력하세요. 3. 그런 다음 해당 그래픽 카드를 찾아 세부 정보 페이지를 클릭합니다. 4. 그런 다음 위의 "기술 지원" 옵션을 입력하세요. 5.마지막으로 "드라이버 및 다운로드"로 이동합니다.

Windows가 지정된 장치, 경로 또는 파일에 액세스할 수 없습니다. Windows가 지정된 장치, 경로 또는 파일에 액세스할 수 없습니다. Jun 18, 2024 pm 04:49 PM

친구의 컴퓨터에 이러한 오류가 있습니다. "이 PC"와 C 드라이브 파일을 열면 "Explorer.EXE Windows가 지정된 장치, 경로 또는 파일에 액세스할 수 없습니다. 프로젝트에 액세스할 수 있는 적절한 권한이 없을 수 있습니다. " 폴더, 파일, 이 컴퓨터, 휴지통 등을 포함하여 더블클릭하면 이런 창이 뜨는데, 마우스 오른쪽 버튼을 클릭해서 여는 것이 정상입니다. 이는 시스템 업데이트로 인해 발생합니다. 이러한 상황이 발생하면 아래 편집기에서 해결 방법을 알려드립니다. 1. 레지스트리 편집기 Win+R을 열고 regedit를 입력하거나 시작 메뉴를 마우스 오른쪽 버튼으로 클릭하여 실행하고 regedit를 입력합니다. 2. "Computer\HKEY_CLASSES_ROOT\PackagedCom\ClassInd" 레지스트리를 찾습니다.

Windows는 업데이트를 영구적으로 일시 중지하고 Windows는 자동 업데이트를 끕니다. Windows는 업데이트를 영구적으로 일시 중지하고 Windows는 자동 업데이트를 끕니다. Jun 18, 2024 pm 07:04 PM

Windows 업데이트로 인해 다음과 같은 문제가 발생할 수 있습니다. 1. 호환성 문제: 일부 응용 프로그램, 드라이버 또는 하드웨어 장치는 새 Windows 업데이트와 호환되지 않아 제대로 작동하지 않거나 충돌이 발생할 수 있습니다. 2. 성능 문제: 때때로 Windows 업데이트로 인해 시스템 속도가 느려지거나 성능 저하가 발생할 수 있습니다. 이는 실행하는 데 더 많은 리소스가 필요한 새로운 기능이나 개선 때문일 수 있습니다. 3. 시스템 안정성 문제: 일부 사용자는 Windows 업데이트를 설치한 후 시스템이 예기치 않은 충돌이나 블루 스크린 오류를 경험할 수 있다고 보고했습니다. 4. 데이터 손실: 드문 경우지만 Windows 업데이트로 인해 데이터 손실이나 파일 손상이 발생할 수 있습니다. 그렇기 때문에 중요한 업데이트를 하기 전에

See all articles