热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php异步处理类-PHP源码

php异步处理类
php代码

Request('http://baidu.com');
$result2    = $obj->Get('https://mail.google.com/');
echo "

"; echo "

";

asynHandle.class.php

Request('http://google.com');
 *  $obj->Get('http://google.com');
 */
 
class asynHandle {
    public      $url        = '';       //传入的完整请求url,包括"http://"或"https://"
    public      $COOKIE     = array();  //传入的COOKIE数组,须是键值对
    public      $post       = array();  //传入的post数组,须是键值对
    public      $timeout    = 30;       //超时秒数
    public      $result     = '';       //获取到的数据
     
    private     $gzip       = true;     //是否开启gzip压缩
    private     $fop        = NULL;     //fsockopen资源句柄
    private     $host       = '';       //主机
    private     $port       = '';       //端口
    private     $referer    = '';       //伪造来路
    private     $requestUri = '';       //实际请求uri
    private     $header     = '';       //头信息
     
    private     $block      = 1;        //网络流状态.1为阻塞,0为非阻塞
    private     $limit      = 128;      //读取的最大字节数  
     
    //构造函数
    public function __construct(){
        ignore_user_abort(TRUE);//忽略用户中断.如果客户端断开连接,不会引起脚本abort
        //set_time_limit(0);//取消脚本执行延时上限
    }
     
    //解析URL并创建资源句柄
    private function analyzeUrl(){
        if ($this->url == ''){return false;}
        $url_array = parse_url($this->url);
        !isset($url_array['host']) && $url_array['host'] = '';     
        !isset($url_array['path']) && $url_array['path'] = '';     
        !isset($url_array['query']) && $url_array['query'] = '';     
        !isset($url_array['port']) && $url_array['port'] = 80;
         
        $this->host          = $url_array['host'];
        $this->port          = $url_array['port'];
        $this->referer       = $url_array['scheme'].'://'.$this->host.'/';
        $this->requestUri    = $url_array['path'] ? 
                            $url_array['path'].($url_array['query'] ? '?'.$url_array['query'] : '') : '/';
         
        switch($url_array['scheme']){
            case 'https':
                $this->fop   = fsockopen('ssl://'.$this->host, 443, $errno, $errstr, $this->timeout);
                break;
            default:
                $this->fop   = fsockopen($this->host, $this->port, $errno, $errstr, $this->timeout);
                break;
        }
         
        if(!$this->fop){
            $this->result    = "$errstr ($errno)
\n"; return false; } return true; }//analyzeUrl end //拼装HTTP的header private function assHeader(){ $method = empty($this->post) ? &#39;GET&#39; : &#39;POST&#39;; $gzip = $this->gzip ? &#39;gzip, &#39; : &#39;&#39;; //COOKIE数据 if(!empty($htis->COOKIE)){ $htis->COOKIE = http_build_COOKIE($htis->COOKIE); } //post数据 if(!empty($this->post)){ $this->post = http_build_query($this->post); } $header = "$method $this->requestUri HTTP/1.0\r\n"; $header .= "Accept: */*\r\n"; $header .= "Referer: $this->referer\r\n"; $header .= "Accept-Language: zh-cn\r\n"; if(!empty($this->post)){ $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; } $header .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n"; $header .= "Host: $this->host\r\n"; if(!empty($this->post)){ $header .= &#39;Content-Length: &#39;.strlen($this->post)."\r\n"; } $header .= "Connection: Close\r\n"; $header .= "Accept-Encoding: {$gzip}deflate\r\n"; $header .= "COOKIE: $this->COOKIE\r\n\r\n"; $header .= $this->post; $this->header = $header; }//assHeader end //返回状态检测,301、302重定向处理 private function checkRecvHeader($header){ if(strstr($header,&#39; 301 &#39;) || strstr($header,&#39; 302 &#39;)){//重定向处理 preg_match("/Location:(.*?)$/im",$header,$match); $url = trim($match[1]); preg_match("/Set-COOKIE:(.*?)$/im",$header,$match); $COOKIE = (empty($match)) ? &#39;&#39; : $match[1]; $obj = new asynHandle(); $result = $obj->Get($url, $COOKIE, $this->post); $this->result = $result; return $result; }elseif(!strstr($header,&#39; 200 &#39;)){ //找不到域名或网址 return false; }else return 200; }//checkRecvHeader end //gzip解压 private function gzdecode($data){ $flags = ord(substr($data, 3, 1)); $headerlen = 10; $extralen = 0; $filenamelen = 0; if ($flags & 4) { $extralen = unpack(&#39;v&#39; ,substr($data, 10, 2)); $extralen = $extralen[1]; $headerlen += 2 + $extralen; } if ($flags & 8) $headerlen = strpos($data, chr(0), $headerlen) + 1; if ($flags & 16) $headerlen = strpos($data, chr(0), $headerlen) + 1; if ($flags & 2) $headerlen += 2; $unpacked = @gzinflate(substr($data, $headerlen)); if ($unpacked === FALSE) $unpacked = $data; return $unpacked; }//gzdecode end //请求函数,只请求,不返回 public function Request($url, $COOKIE=array(), $post=array(), $timeout=3){ $this->url = $url; $this->COOKIE = $COOKIE; $this->post = $post; $this->timeout = $timeout; if(!$this->analyzeUrl()){ return $this->result; } $this->assHeader(); stream_set_blocking($this->fop, 0);//非阻塞,无须等待 fwrite($this->fop, $this->header); fclose($this->fop); return true; }//Request end //获取函数,请求并返回 public function Get($url, $COOKIE=array(), $post=array(), $timeout=30){ $this->url = $url; $this->COOKIE = $COOKIE; $this->post = $post; $this->timeout = $timeout; if(!$this->analyzeUrl()){ return $this->result; } $this->assHeader(); stream_set_blocking($this->fop, $this->block); stream_set_timeout($this->fop, $this->timeout); fwrite($this->fop, $this->header); $status = stream_get_meta_data($this->fop); if(!$status[&#39;timed_out&#39;]){ $h=&#39;&#39;; while(!feof($this->fop)){ if(($header = @fgets($this->fop)) && ($header == "\r\n" || $header == "\n")){ break; } $h .= $header; } $checkHttp = $this->checkRecvHeader($h); if($checkHttp!=200){return $checkHttp;} $stop = false; $return = &#39;&#39;; $this->gzip = false; if(strstr($h,&#39;gzip&#39;)) $this->gzip = true; while(!($stop && $status[&#39;timed_out&#39;] && feof($this->fop))){ if($status[&#39;timed_out&#39;]) return false; $data = fread($this->fop, ($this->limit == 0 || $this->limit > 128 ? 128 : $this->limit)); if($data == &#39;&#39;){//有些服务器不行,须自行判断FOEF break; } $return .= $data; if($this->limit){ $this->limit -= strlen($data); $stop = $this->limit <= 0; } } @fclose($this->fop); $this->result = $this->gzip ? $this->gzdecode($return) : $return; return $this->result; }else{ return false; } }//Get end }

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
author-avatar
陈应锋forever
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有