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. }