当前位置:首页 > PHP教程 > php应用 > 列表

php fsockopen异步处理实例程序

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-11 15:58:08 浏览: 评论:0 

php中异步处理数据我们最简单的方法就是使用fsockopen了,下面我来介绍基于fsockopen函数实现的异步处理,希望对各位会带来帮助.

例子test.php代码如下:

  1. <?php 
  2. $domain = "localhost"
  3. $url = '/platform_php_sdk/test4.php'
  4. $header = "POST $url HTTP/1.0\r\n"
  5. $header .= "Content-Type:application/x-www-form-urlencoded\r\n"
  6. $par = "email=zhangzenglun@163.com"
  7. $header .="Content-Length:".strlen($par)."\r\n\r\n"
  8. $fp = @fsockopen($domain,80,$errno,$errstr,30); 
  9. fputs($fp$header.$par); 
  10. fclose($fp); 
  11. echo 'send ok!'
  12. ?> 

test4.php,代码如下:

  1. <?php 
  2. set_time_limit ( 0 ); 
  3. ignore_user_abort ( true ); 
  4. $i = 0; 
  5. while ( $i ++ < 50 ) { 
  6. file_put_contents ( $i . '.php'$_REQUEST['email'].$i); 
  7. sleep ( 3 ); 
  8. ?> 

补充一个异步处理类,该类可以请求HTTP和HTTPS协议,还可以处理301、302重定向以及GZIP压缩等,代码如下.

asynHandle.class.php,代码如下:

  1. <?php 
  2. class AsynHandle { 
  3.     public        $url        = '';        //传入的完整请求url,包括"http://"或"https://" 
  4.     public        $cookie        = array();    //传入的cookie数组,须是键值对 
  5.     public        $post        = array();    //传入的post数组,须是键值对 
  6.     public        $timeout    = 30;        //超时秒数 
  7.     public        $result        = '';        //获取到的数据 
  8.     
  9.     private        $gzip        = true;        //是否开启gzip压缩 
  10.     private        $fop        = NULL;        //fsockopen资源句柄 
  11.     private        $host        = '';        //主机 
  12.     private        $port        = '';        //端口 
  13.     private        $referer    = '';        //伪造来路 
  14.     private        $requestUri    = '';        //实际请求uri 
  15.     private        $header        = '';        //头信息 
  16.     
  17.     private        $block        = 1;        //网络流状态.1为阻塞,0为非阻塞 
  18.     private        $limit        = 128;        //读取的最大字节数    
  19.     
  20.     //构造函数 
  21.     public function __construct(){ 
  22.         ignore_user_abort(TRUE);//忽略用户中断.如果客户端断开连接,不会引起脚本abort 
  23.         //set_time_limit(0);//取消脚本执行延时上限 
  24.     } 
  25.     //解析URL并创建资源句柄 
  26.     private function analyzeUrl(){ 
  27.         if ($this->url == ''){return false;} 
  28.         $url_array = parse_url($this->url); 
  29.         !isset($url_array['host']) && $url_array['host'] = '';     
  30.         !isset($url_array['path']) && $url_array['path'] = '';     
  31.         !isset($url_array['query']) && $url_array['query'] = '';     
  32.         !isset($url_array['port']) && $url_array['port'] = 80; 
  33.         
  34.         $this->host            = $url_array['host']; 
  35.         $this->port            = $url_array['port']; 
  36.         $this->referer        = $url_array['scheme'].'://'.$this->host.'/'
  37.         $this->requestUri    = $url_array['path'] ? 
  38.                             $url_array['path'].($url_array['query'] ? '?'.$url_array['query'] : '') : '/'
  39.         
  40.         switch($url_array['scheme']){ 
  41.             case 'https'
  42.                 $this->fop    = fsockopen('ssl://'.$this->host, 443, $errno$errstr$this->timeout); 
  43.                 break
  44.             default
  45.                 $this->fop    = fsockopen($this->host, $this->port, $errno$errstr$this->timeout); 
  46.                 break
  47.         } 
  48.         
  49.         if(!$this->fop){ 
  50.             $this->result    = "$errstr ($errno)<br />\n"
  51.             return false; 
  52.         } 
  53.         return true; 
  54.     }//analyzeUrl end 
  55.     
  56.     //拼装HTTP的header 
  57.     private function assHeader(){ 
  58.         $method = emptyempty($this->post) ? 'GET' : 'POST'
  59.         $gzip = $this->gzip ? 'gzip, ' : ''
  60.         
  61.         //cookie数据 
  62.         if(!emptyempty($htis->cookie)){ 
  63.             $htis->cookie = http_build_cookie($htis->cookie); 
  64.         } 
  65.         
  66.         //post数据 
  67.         if(!emptyempty($this->post)){            
  68.             $this->post = http_build_query($this->post); 
  69.         } 
  70.         
  71.         $header    = "$method $this->requestUri HTTP/1.0\r\n"
  72.         $header    .= "Accept: */*\r\n"
  73.         $header    .= "Referer: $this->referer\r\n"
  74.         $header    .= "Accept-Language: zh-cn\r\n"
  75.         if(!emptyempty($this->post)){ 
  76.             $header    .= "Content-Type: application/x-www-form-urlencoded\r\n"
  77.         } 
  78.         $header    .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n"
  79.         $header    .= "Host: $this->host\r\n"
  80.         if(!emptyempty($this->post)){ 
  81.             $header    .= 'Content-Length: '.strlen($this->post)."\r\n"
  82.         } 
  83.         $header    .= "Connection: Close\r\n"
  84.         $header    .= "Accept-Encoding: {$gzip}deflate\r\n"
  85.         $header    .= "Cookie: $this->cookie\r\n\r\n"
  86.         $header    .= $this->post; 
  87.         $this->header    = $header
  88.     }//assHeader end 
  89.     
  90.     //返回状态检测,301、302重定向处理 
  91.     private function checkRecvHeader($header){ 
  92.         if(strstr($header,' 301 ') || strstr($header,' 302 ')){//重定向处理 
  93.             preg_match("/Location:(.*?)$/im",$header,$match); 
  94.             $url = trim($match[1]); 
  95.             preg_match("/Set-Cookie:(.*?)$/im",$header,$match); 
  96.             $cookie    = (emptyempty($match)) ? '' : $match[1]; 
  97.             
  98.             $obj            = new AsynHandle(); 
  99.             $result            = $obj->Get($url$cookie$this->post); 
  100.             $this->result    = $result
  101.             return $result
  102.         }elseif(!strstr($header,' 200 ')){ 
  103.             //找不到域名或网址 
  104.             return false; 
  105.         }else return 200; 
  106.     }//checkRecvHeader end 
  107.     
  108.     //gzip解压 
  109.     private function gzdecode($data){ 
  110.         $flags = ord(substr($data, 3, 1)); 
  111.         $headerlen = 10; 
  112.         $extralen = 0; 
  113.         $filenamelen = 0; 
  114.         if ($flags & 4) { 
  115.             $extralen = unpack('v' ,substr($data, 10, 2)); 
  116.             $extralen = $extralen[1]; 
  117.             $headerlen += 2 + $extralen
  118.         } 
  119.         if ($flags & 8) $headerlen = strpos($datachr(0), $headerlen) + 1; 
  120.         if ($flags & 16) $headerlen = strpos($datachr(0), $headerlen) + 1;  //开源软件:phpfensi.com 
  121.         if ($flags & 2) $headerlen += 2; 
  122.         $unpacked = @gzinflate(substr($data$headerlen)); 
  123.         if ($unpacked === FALSE) $unpacked = $data
  124.         return $unpacked
  125.     }//gzdecode end 
  126.     
  127.     //请求函数,只请求,不返回 
  128.     public function Request($url$cookie=array(), $post=array(), $timeout=3){ 
  129.         $this->url        = $url
  130.         $this->cookie    = $cookie
  131.         $this->post        = $post
  132.         $this->timeout    = $timeout
  133.         
  134.         if(!$this->analyzeUrl()){ 
  135.             return $this->result; 
  136.         } 
  137.         $this->assHeader(); 
  138.         
  139.         stream_set_blocking($this->fop, 0);//非阻塞,无须等待 
  140.         fwrite($this->fop, $this->header); 
  141.         fclose($this->fop); 
  142.         return true; 
  143.     }//Request end 
  144.     
  145.     //获取函数,请求并返回 
  146.     public function Get($url$cookie=array(), $post=array(), $timeout=30){ 
  147.         $this->url        = $url
  148.         $this->cookie    = $cookie
  149.         $this->post        = $post
  150.         $this->timeout    = $timeout
  151.         
  152.         if(!$this->analyzeUrl()){ 
  153.             return $this->result; 
  154.         } 
  155.         $this->assHeader(); 
  156.         
  157.         stream_set_blocking($this->fop, $this->block);   
  158.         stream_set_timeout($this->fop, $this->timeout); 
  159.         fwrite($this->fop, $this->header); 
  160.         $status = stream_get_meta_data($this->fop); 
  161.         
  162.         if(!$status['timed_out']){ 
  163.             $h=''
  164.             while(!feof($this->fop)){ 
  165.                 if(($header = @fgets($this->fop)) && ($header == "\r\n" ||  $header == "\n")){ 
  166.                     break
  167.                 } 
  168.                 $h .= $header
  169.             } 
  170.             
  171.             $checkHttp    = $this->checkRecvHeader($h); 
  172.             if($checkHttp!=200){return $checkHttp;} 
  173.             
  174.             $stop = false; 
  175.             $return = ''
  176.             $this->gzip = false; 
  177.             if(strstr($h,'gzip')) $this->gzip = true; 
  178.             while(!($stop && $status['timed_out'] && feof($this->fop))){ 
  179.                 if($status['timed_out']) return false; 
  180.                 $data = fread($this->fop, ($this->limit == 0 || $this->limit > 128 ? 128 : $this->limit));  
  181.                 if($data == ''){//有些服务器不行,须自行判断FOEF 
  182.                     break
  183.                 } 
  184.                 $return    .= $data
  185.                 if($this->limit){ 
  186.                     $this->limit -= strlen($data); 
  187.                     $stop = $this->limit <= 0; 
  188.                 } 
  189.                 
  190.             } 
  191.             @fclose($this->fop); 
  192.             $this->result    = $this->gzip ? $this->gzdecode($return) : $return
  193.             return $this->result; 
  194.         }else
  195.             return false; 
  196.         } 
  197.     }//Get end 
  198. ?>

Tags: fsockopen php异步处理

分享到: