curl_multi

来源:互联网 发布:软件实施顾问岗位职责 编辑:程序博客网 时间:2024/06/05 21:14

一般来说,想到要用curl_multi_init()时,目的是要同时请求多个url,而不是一个一个依次请求,否则就要curl_init()了。

不过,在使用curl_multi的时候,你可能遇到cpu消耗过高、网页假死等现象,可以看看如何解决curl_multi导致网页假死的问题

使用curl_multi的步骤总结如下:

第一步:调用curl_multi_init第二步:循环调用curl_multi_add_handle这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle。第三步:持续调用curl_multi_exec第四步:根据需要循环调用curl_multi_getcontent获取结果第五步:调用curl_multi_remove_handle,并为每个字handle调用curl_close第六步:调用curl_multi_close

各函数作用解释:

curl_multi_init()初始化一个curl批处理句柄资源。curl_multi_add_handle()curl批处理会话中添加单独的curl句柄资源。curl_multi_add_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。curl_multi_exec()解析一个curl批处理句柄,curl_multi_exec()函数有两个参数,第一个参数表示一个批处理句柄资源,第二个参数是一个引用值的参数,表示剩余需要处理的单个的curl句柄资源数量。curl_multi_remove_handle()移除curl批处理句柄资源中的某个句柄资源,curl_multi_remove_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。curl_multi_close()关闭一个批处理句柄资源。curl_multi_getcontent()在设置了CURLOPT_RETURNTRANSFER的情况下,返回获取的输出的文本流。curl_multi_info_read()获取当前解析的curl的相关传输信息。

测试例子

<?php    // 创建一对cURL资源    $ch1 = curl_init();        $ch2 = curl_init();    // 设置URL和相应的选项    curl_setopt($ch1, CURLOPT_URL, "http://note.youdao.com/");    curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);    curl_setopt($ch2, CURLOPT_URL, "http://www.hao123.com/");    curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);    // 创建批处理cURL句柄    $mh = curl_multi_init();    // 增加2个句柄    curl_multi_add_handle($mh, $ch1);    curl_multi_add_handle($mh, $ch2);    $active = null;    // 执行批处理句柄    do {        $mrc = curl_multi_exec($mh,$active);    } while ($mrc == CURLM_CALL_MULTI_PERFORM);    while ($active && $mrc == CURLM_OK) {        if (curl_multi_select($mh) == -1) {            usleep(100);        }        do {            $mrc = curl_multi_exec($mh, $active);        } while ($mrc == CURLM_CALL_MULTI_PERFORM);    }    $resp_array = array();    $resp_array[] = curl_multi_getcontent($ch1);    $resp_array[] = curl_multi_getcontent($ch2);    print_r($resp_array);    // 关闭全部句柄    curl_multi_remove_handle($mh, $ch1);    curl_multi_remove_handle($mh, $ch2);    curl_close($ch1);    curl_close($ch2);    curl_multi_close($mh);?>
0 0