curl_multi_add_handle()
(PHP 5, PHP 7)
向curl批处理会话中添加单独的curl句柄
说明
curl_multi_add_handle(resource $mh,resource $ch): int
增加$ch句柄到批处理会话$mh
参数
- $mh
由curl_multi_init()返回的 cURL 多个句柄。
- $ch
由curl_init()返回的 cURL 句柄。
返回值
成功时返回0,失败时返回CURLM_XXX
之一的错误码。
范例
curl_multi_add_handle() example
这个范例将会创建2个cURL句柄,把它们加到批处理句柄,然后并行地运行它们。
<?php // 创建一对cURL资源 $ch1 = curl_init(); $ch2 = curl_init(); // 设置URL和相应的选项 curl_setopt($ch1, CURLOPT_URL, "http://www.example.com/"); curl_setopt($ch1, CURLOPT_HEADER, 0); curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/"); curl_setopt($ch2, CURLOPT_HEADER, 0); // 创建批处理cURL句柄 $mh = curl_multi_init(); // 增加2个句柄 curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $running=null; // 执行批处理句柄 do { curl_multi_exec($mh,$running); } while($running > 0); // 关闭全部句柄 curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh); ?>
参见
curl_multi_remove_handle()
移除cURL批处理句柄资源中的某个句柄资源curl_multi_init()
返回一个新cURL批处理句柄curl_init()
初始化 cURL 会话
The 'do' loop in this example will cycle indefinitely until all curl downloads complete, needlessly using CPU cycles. A much better way is to block while dowloads are in progress. Refer to the example code on the curl_multi_exec() page instead, which does this!
Sometime with arrays and loops (i.e. for or do while or foreach) curl_multi_init loses some hits, to work around this problem it is necessary to divide the loop into two parts: the start with key number zero and than, all the rest. In this way the curl_multi_init doesn't lose any hits. I did a lot of test and it seems to work well enough. <?php function set_option($x, $y){ curl_setopt($x, CURLOPT_URL, $y); curl_setopt($x, CURLOPT_HEADER, 0); curl_setopt($x, CURLOPT_FOLLOWLOCATION, TRUE); curl_setopt($x, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($x, CURLOPT_ENCODING, "gzip,deflate"); } $nodes = array('http://php.net/manual/it/function.curl-multi-add-handle.php', 'http://php.net/manual/en/function.curl-multi-init.php', 'http://php.net/manual/en/function.curl-multi-setopt.php' ); $node_count = count($nodes); $curl_arr = array(); $master = curl_multi_init(); /* now I put the first part of the array with the start key number zero, add all options and add the curl_multi_add_handle; it is necessary to detach this first part to avoid to lose some handles and than running the loop with the start key number one. In this way the curl_multi_init doesn't lose anything and seems to be very stable. */ $curl_arr[0] = curl_init($nodes[0]); set_option($curl_arr[0], $nodes[0]); curl_multi_add_handle($master, $curl_arr[0]); /* now the loop can start with key number one */ $i = 1; do { if ($i!==0){ $curl_arr[$i] = curl_init($nodes[$i]); set_option($curl_arr[$i], $nodes[$i]); curl_multi_add_handle($master, $curl_arr[$i]); } $i++; }while($i < $node_count); $running = NULL; do { curl_multi_exec($master,$running); } while($running); $results = array(); $q = 0; do{ $results[$q] = curl_multi_getcontent($curl_arr[$q]); curl_multi_remove_handle($master, $curl_arr[$q]); $q++; }while($q < $node_count); foreach($results as $value){ echo $value; } ?>
$nodes = array('http://www.google.com', 'http://www.microsoft.com', 'http://yahoo.com'); $node_count = count($nodes); $curl_arr = array(); $master = curl_multi_init(); for($i = 0; $i < $node_count; $i++) { $url =$nodes[$i]; $curl_arr[$i] = curl_init($url); curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true); curl_multi_add_handle($master, $curl_arr[$i]); } do { curl_multi_exec($master,$running); } while($running > 0); echo "results: "; for($i = 0; $i < $node_count; $i++) { $results = curl_multi_getcontent ( $curl_arr[$i] ); echo( $i . "\n" . $results . "\n"); } echo 'done';