1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
| <?php
class Helper_Multicurl { static private $mh = null; static private $arr_ch = array();
static public function mk_curl($type, $url, array $data=array(), array $ex_arg=array()) { $ch = curl_init();
$option = array( CURLOPT_RETURNTRANSFER => 1, );
if ($type=='get' && $data) { $url .= (strpos($url, '?') ? '&' : '?').http_build_query($data); } $option[CURLOPT_URL] = $url;
if ($type=='post' && $data) { $option[CURLOPT_POSTFIELDS] = $data; }
$option += $ex_arg;
curl_setopt_array($ch, $option);
return $ch; }
static private function _multi_init() { if (is_null(self::$mh)) { self::$mh = curl_multi_init(); } }
static private function _clear() { self::$mh = null; self::$arr_ch = array(); }
static public function add_curl($k, $ch) { self::_multi_init();
$ret = curl_multi_add_handle(self::$mh, $ch); if ($ret != 0) { return false; }
if (isset(self::$arr_ch[$k])) { curl_multi_remove_handle(self::$mh, self::$arr_ch[$k]); curl_close(self::$arr_ch[$k]); unset(self::$arr_ch[$k]); } self::$arr_ch[$k] = $ch;
return true; }
static public function multi_exec(array $arr_ch = array()) { $data = array();
foreach ($arr_ch as $k => $ch) { self::add_curl($k, $ch); }
if (is_null(self::$mh)) { return $data; }
do { $mrc = curl_multi_exec(self::$mh,$active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active && $mrc == CURLM_OK) { if (curl_multi_select(self::$mh) != -1) { do { $mrc = curl_multi_exec(self::$mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } foreach (self::$arr_ch as $k => $ch) { $data[$k] = curl_multi_getcontent($ch); curl_multi_remove_handle(self::$mh, $ch); curl_close($ch); } curl_multi_close(self::$mh);
self::_clear();
return $data; } }
|
这工具本质是发起并行请求,但若请求的自己定义的特殊接口,完全可以实现php伪多线程,进行某些数据的并行处理。
如自定义一个db查询接口,参数是sql(当然还有一下其它安全验证的参数等),返回值是查询结果。然后使用这个curl并行请求这个接口,那实现多条sql语句同时查询的功能。
并行查询数据库只是一个简单的例子,原则上所有不相互依赖的业务逻辑,都可以使用这种方法转为并行处理。
转载自 http://blog.csdn.net/tsxw24/article/details/7979172