VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > PHP >
  • PHP实现的CURL非阻塞调用类

这篇文章主要介绍了PHP实现的CURL非阻塞调用类,结合实例形式分析了php使用curl实现的非阻塞调用类具体定义与使用技巧,需要的朋友可以参考下。

本文实例讲述了PHP实现的CURL非阻塞调用类,分享给大家供大家参考,具体如下:

前面一篇《PHP实现非阻塞模式的方法》文章讲述了PHP中实现非阻塞模式,其实如果只是HTTP的话,直接用CURL就能实现。

基于网上的一段代码,修改完善后封装了一个支持POST/GET的非阻塞调用类。

欢迎测试bug~~~~~

  1. /***************************************************** 
  2.  CURL 非阻塞调用类 
  3.  Auther: Linvo 
  4.  Copyright(C) 2010/10/21 
  5. *******************************************************/ 
  6. /* 
  7.   // 使用范例 
  8.   // 传入参数说明 
  9.   // url 请求地址 
  10.   // data POST方式数据 
  11.   //并发调用 
  12.   $param1 = array( 
  13.       array( 
  14.         'url' => "http://localhost/a.php?s=1", 
  15.         ), 
  16.       array( 
  17.         'url' => "http://localhost/a.php?s=1", 
  18.         'data' => array('aaa' => 1, 'bbb' => 2), 
  19.         ), 
  20.       ); 
  21.   //单个调用 
  22.   $param2 = array( 
  23.       'url' => "http://localhost/a.php?s=0", 
  24.       'data' => array('aaa' => 1, 'bbb' => 2), 
  25.       ); 
  26.   //单个调用(GET简便方式) 
  27.   $param3 = 'http://localhost/a.php?s=2'; 
  28.   $ac = new AsyncCURL(); 
  29.   $ac->set_param($param1); 
  30.   $ret = $ac->send(); 
  31.   //返回值为请求参数顺序的结果数组(元素值为False表示请求错误) 
  32.   var_dump($ret); 
  33. */ 
  34. class AsyncCURL 
  35. { 
  36.   /** 
  37.    * 是否需要返回HTTP头信息 
  38.    */ 
  39.   public $curlopt_header = 0; 
  40.   /** 
  41.    * 单个CURL调用超时限制 
  42.    */ 
  43.   public $curlopt_timeout = 20; 
  44.   private $param = array(); 
  45.   /** 
  46.    * 构造函数(可直接传入请求参数) 
  47.    * 
  48.    * @param array 可选 
  49.    * @return void 
  50.    */ 
  51.   public function __construct($param = False) 
  52.   { 
  53.     if ($param !== False) 
  54.     { 
  55.       $this->param = $this->init_param($param); 
  56.     } 
  57.   } 
  58.   /** 
  59.    * 设置请求参数 
  60.    * 
  61.    * @param array 
  62.    * @return void 
  63.    */ 
  64.   public function set_param($param) 
  65.   { 
  66.     $this->param = $this->init_param($param); 
  67.   } 
  68.   /** 
  69.    * 发送请求 
  70.    * 
  71.    * @return array 
  72.    */ 
  73.   public function send() 
  74.   { 
  75.     if(!is_array($this->param) || !count($this->param)) 
  76.     { 
  77.       return False; 
  78.     } 
  79.     $curl = $ret = array(); 
  80.     $handle = curl_multi_init(); 
  81.     foreach ($this->param as $k => $v) 
  82.     { 
  83.       $param = $this->check_param($v); 
  84.       if (!$param) $curl[$k] = False; 
  85.       else $curl[$k] = $this->add_handle($handle, $param); 
  86.     } 
  87.     $this->exec_handle($handle); 
  88.     foreach ($this->param as $k => $v) 
  89.     { 
  90.       if ($curl[$k]) 
  91.       { 
  92.         $ret[$k] = curl_multi_getcontent($curl[$k]); 
  93.         curl_multi_remove_handle($handle, $curl[$k]); 
  94.       } else { 
  95.         $ret[$k] = False; 
  96.       } 
  97.     } 
  98.     curl_multi_close($handle); 
  99.     return $ret; 
  100.   } 
  101.   //以下为私有方法 
  102.   private function init_param($param) 
  103.   { 
  104.     $ret = False; 
  105.     if (isset($param['url'])) 
  106.     { 
  107.       $ret = array($param); 
  108.     } else { 
  109.       $ret = isset($param[0]) ? $param : False; 
  110.     } 
  111.     return $ret; 
  112.   } 
  113.   private function check_param($param = array()) 
  114.   { 
  115.     $ret = array(); 
  116.     if (is_string($param)) 
  117.     { 
  118.       $url = $param; 
  119.     } else { 
  120.       extract($param); 
  121.     } 
  122.     if (isset($url)) 
  123.     { 
  124.       $url = trim($url); 
  125.       $url = stripos($url, 'http://') === 0 ? $url : NULL; 
  126.     } 
  127.     if (isset($data) && is_array($data) && !emptyempty($data)) 
  128.     { 
  129.       $method = 'POST'; 
  130.     } else { 
  131.       $method = 'GET'; 
  132.       unset($data); 
  133.     } 
  134.     if (isset($url)) $ret['url'] = $url; 
  135.     if (isset($method)) $ret['method'] = $method; 
  136.     if (isset($data)) $ret['data'] = $data; 
  137.     $ret = isset($url) ? $ret : False; 
  138.     return $ret; 
  139.   } 
  140.   private function add_handle($handle, $param) 
  141.   { 
  142.     $curl = curl_init(); 
  143.     curl_setopt($curl, CURLOPT_URL, $param['url']); 
  144.     curl_setopt($curl, CURLOPT_HEADER, $this->curlopt_header); 
  145.     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
  146.     curl_setopt($curl, CURLOPT_TIMEOUT, $this->curlopt_timeout); 
  147.     if ($param['method'] == 'POST') 
  148.     { 
  149.       curl_setopt($curl, CURLOPT_POST, 1); 
  150.       curl_setopt($curl, CURLOPT_POSTFIELDS, $param['data']); 
  151.     } 
  152.     curl_multi_add_handle($handle, $curl); 
  153.     return $curl; 
  154.   } 
  155.   private function exec_handle($handle) 
  156.   { 
  157.     $flag = null; 
  158.     do { 
  159.       curl_multi_exec($handle, $flag); 
  160.     } while ($flag > 0); 
  161.   } 
  162. }
  163.  

出处:http://www.phpfensi.com/php/20211020/18198.html


相关教程