当前位置:首页 > PHP教程 > php类库 > 列表

PHP实现的CURL非阻塞调用类

发布:smiling 来源: PHP粉丝网  添加日期:2021-10-20 12:02:56 浏览: 评论:0 

这篇文章主要介绍了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.    * 是否需要返回HTTP头信息 
  37.    */ 
  38.   public $curlopt_header = 0; 
  39.   /** 
  40.    * 单个CURL调用超时限制 
  41.    */ 
  42.   public $curlopt_timeout = 20; 
  43.   private $param = array(); 
  44.   /** 
  45.    * 构造函数(可直接传入请求参数) 
  46.    * 
  47.    * @param array 可选 
  48.    * @return void 
  49.    */ 
  50.   public function __construct($param = False) 
  51.   { 
  52.     if ($param !== False) 
  53.     { 
  54.       $this->param = $this->init_param($param); 
  55.     } 
  56.   } 
  57.   /** 
  58.    * 设置请求参数 
  59.    * 
  60.    * @param array 
  61.    * @return void 
  62.    */ 
  63.   public function set_param($param
  64.   { 
  65.     $this->param = $this->init_param($param); 
  66.   } 
  67.   /** 
  68.    * 发送请求 
  69.    * 
  70.    * @return array 
  71.    */ 
  72.   public function send() 
  73.   { 
  74.     if(!is_array($this->param) || !count($this->param)) 
  75.     { 
  76.       return False; 
  77.     } 
  78.     $curl = $ret = array(); 
  79.     $handle = curl_multi_init(); 
  80.     foreach ($this->param as $k => $v
  81.     { 
  82.       $param = $this->check_param($v); 
  83.       if (!$param$curl[$k] = False; 
  84.       else $curl[$k] = $this->add_handle($handle$param); 
  85.     } 
  86.     $this->exec_handle($handle); 
  87.     foreach ($this->param as $k => $v
  88.     { 
  89.       if ($curl[$k]) 
  90.       { 
  91.         $ret[$k] = curl_multi_getcontent($curl[$k]); 
  92.         curl_multi_remove_handle($handle$curl[$k]); 
  93.       } else { 
  94.         $ret[$k] = False; 
  95.       } 
  96.     } 
  97.     curl_multi_close($handle); 
  98.     return $ret
  99.   } 
  100.   //以下为私有方法 
  101.   private function init_param($param
  102.   { 
  103.     $ret = False; 
  104.     if (isset($param['url'])) 
  105.     { 
  106.       $ret = array($param); 
  107.     } else { 
  108.       $ret = isset($param[0]) ? $param : False; 
  109.     } 
  110.     return $ret
  111.   } 
  112.   private function check_param($param = array()) 
  113.   { 
  114.     $ret = array(); 
  115.     if (is_string($param)) 
  116.     { 
  117.       $url = $param
  118.     } else { 
  119.       extract($param); 
  120.     } 
  121.     if (isset($url)) 
  122.     { 
  123.       $url = trim($url); 
  124.       $url = stripos($url'http://') === 0 ? $url : NULL; 
  125.     } 
  126.     if (isset($data) && is_array($data) && !emptyempty($data)) 
  127.     { 
  128.       $method = 'POST'
  129.     } else { 
  130.       $method = 'GET'
  131.       unset($data); 
  132.     } 
  133.     if (isset($url)) $ret['url'] = $url
  134.     if (isset($method)) $ret['method'] = $method
  135.     if (isset($data)) $ret['data'] = $data
  136.     $ret = isset($url) ? $ret : False; 
  137.     return $ret
  138.   } 
  139.   private function add_handle($handle$param
  140.   { 
  141.     $curl = curl_init(); 
  142.     curl_setopt($curl, CURLOPT_URL, $param['url']); 
  143.     curl_setopt($curl, CURLOPT_HEADER, $this->curlopt_header); 
  144.     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
  145.     curl_setopt($curl, CURLOPT_TIMEOUT, $this->curlopt_timeout); 
  146.     if ($param['method'] == 'POST'
  147.     { 
  148.       curl_setopt($curl, CURLOPT_POST, 1); 
  149.       curl_setopt($curl, CURLOPT_POSTFIELDS, $param['data']); 
  150.     } 
  151.     curl_multi_add_handle($handle$curl); 
  152.     return $curl
  153.   } 
  154.   private function exec_handle($handle
  155.   { 
  156.     $flag = null; 
  157.     do { 
  158.       curl_multi_exec($handle$flag); 
  159.     } while ($flag > 0); 
  160.   } 
  161. }

Tags: CURL非阻塞 PHP非阻塞调用类

分享到: