芒果小站

  1. 全球最具业界良心的主机 - Linode

    毫无疑问,目前做得最好的主机供应商

    猛击这里查看

  2. 芒果小站目前使用的主机 - Linode

    客服响应快,随时退款,XEN 架构稳定

    猛击这里查看

  3. 最好的日本东京线路主机 - Linode

    可选弗里蒙特、达拉斯、亚特兰大、纽瓦克、伦敦、东京机房

    猛击这里查看

  • 1
  • 2
  • 3
切换到精简模式
1

使用 curl_multi_init 执行并发请求

作者 芒果/分类 代码/发布于 2013-01-05 20:08

PHP 语言不像 JavaScript 那样具备异步回调的特性,实现并发也就有些棘手。不过对于服务器之间进行连接和通讯,PHP 良好支持了 libcurl 库,要执行一批并发请求,依靠 curl_multi_init 方法就可以轻松搞定。

通常,一个简单的 CURL 请求是这样被组装和发送的:

		$ch = curl_init();
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_TIMEOUT, 10);
		$data = curl_exec($ch);
		curl_close($ch);

一旦 curl_exec 被执行,我们就可以捕获到 $data 变量,也就是所需要的响应结果。

换做 curl_multi_exec 同样有效,原生 PHP 允许并行地处理批处理 CURL 句柄。那么如何实现一批并发的 CURL 句柄呢?我们可以通过建立一个 CURL 批处理会话,来控制两个独立的 CURL 句柄。当会话需要执行时,通过 curl_multi_exec 去处理在栈中的一个句柄。封装成一个函数,基本是这样的:

	function curl_multi ($query_arr) {
		$ch = curl_multi_init();
		$count = count($query_arr);
		$ch_arr = array();
		for ($i = 0; $i < $count; $i++) {
			$query_string = $query_arr[$i];
			$ch_arr[$i] = curl_init($query_string);
			curl_setopt($ch_arr[$i], CURLOPT_RETURNTRANSFER, true);
			curl_multi_add_handle($ch, $ch_arr[$i]);
		}
		$running = null;
		do {
			curl_multi_exec($ch, $running);
		} while ($running > 0);
		for ($i = 0; $i < $count; $i++) {
			$results[$i] = curl_multi_getcontent($ch_arr[$i]);
			curl_multi_remove_handle($ch, $ch_arr[$i]);
		}
		curl_multi_close($ch);
		return $results;
	}

最终所返回的数据是一个由单独 CURL 句柄响应组成的结果集数组。和单独请求相比,基本可以节约一半的时间。

版权所有,转载请注明出处。
转载自 <a href="http://mangguo.org/curl-multi-init-execute-concurrent-requests/" title="使用 curl_multi_init 执行并发请求" rel="bookmark">使用 curl_multi_init 执行并发请求 | 芒果小站</a>
如果喜欢这篇文章,欢迎订阅芒果小站以获得最新内容。

已经有 1 条群众意见

  1. ?
    使用 curl_multi_init 执行并发请求 | wordpress主题下载|wordpress教程|wordpress 插件| wordpress主机 /2013-01-10 15:12

    […] 2010 芒果小站 | 固定链接 | 没有评论 | 标签 curl_multi_exec, curl_multi_init […] 回应

    #1

下面我简单说几句