curl_multi_init
初始化批处理句柄
curl_multi_init ( void ) : resource
允许并行地处理批处理 cURL
句柄。
成功时返回一个 cURL
批处理句柄,失败时返回 FALSE
。
curl_multi_add_handle
向批处理句柄添加单独的 curl 句柄
curl_multi_add_handle ( resource $mh , resource $ch ) : int
mh
由
curl_multi_init()
返回的cURL
批处理句柄。ch
由
curl_init()
返回的cURL
句柄。
增加 ch
句柄到批处理会话 mh
成功时返回 0
,失败时返回 CURLM_XXX
之一的错误码。
curl_multi_remove_handle
从批处理句柄中移除某个单独句柄
curl_multi_remove_handle ( resource $mh , resource $ch ) : int
mh
由
curl_multi_init()
返回的cURL
批处理句柄。ch
由 curl_init()
返回的 cURL
句柄。
从给定的批处理句柄 mh
中移除 ch
句柄。如果要移除的句柄正在被使用,则这个句柄涉及的所有传输任务会被中止。
成功时返回一个cURL句柄,失败时返回 FALSE
ch
句柄只是从 curl 批处理句柄中被移除,仍然可以合法地用curl_exec()
单独执行这个 curl 句柄。
curl_multi_exec
运行批处理句柄
curl_multi_exec ( resource $mh , int &$still_running ) : int
mh
由
curl_multi_init()
返回的cURL
批处理句柄。still_running
一个用来判断操作是否仍在执行的标识的引用。初始的
still_running
等于栈中的句柄数,每次执行curl_multi_exec()
这个数组会减少,直到为 0 说明所有句柄处理完成。
处理在栈中的每一个句柄。无论该句柄需要读取或写入数据都可调用此方法。
返回一个定义于 cURL
预定义常量中的 cURL
代码:
CURLM_CALL_MULTI_PERFORM(-1)
不是真正的错误,这意味着你需要再次调用
curl_multi_exec()
,因为仍有数据可供处理。CURLM_OK(0)
一切都好了。这意味着部分(或全部)句柄已经执行完成,需要根据
still_running
判断是否还有句柄需要执行,如果有,则调用curl_multi_select()
等待活动连接。错误码中的一个:CURLM_BAD_HANDLE,CURLM_OUT_OF_MEMORY,CURLM_INTERNAL_ERROR,CURLM_BAD_SOCKET。所有这些表明我们需要停止处理。
curl_multi_select
等待活动连接
curl_multi_select ( resource $mh [, float $timeout = 1.0 ] ) : int
mh
由
curl_multi_init()
返回的 cURL 多个句柄。timeout
以秒为单位,等待响应的时间。
阻塞直到 cURL
批处理连接中有活动连接。
成功时返回描述符集合中描述符的数量。失败时,select失败时返回-1,否则返回超时(从底层的select系统调用).
curl_multi_getcontent
获取输出的文本
curl_multi_getcontent ( resource $ch ) : string
ch
由
curl_init()
返回的cURL
句柄。
如果 CURLOPT_RETURNTRANSFER
作为一个选项被设置到一个具体的句柄,那么这个函数将会以字符串的形式返回那个 cURL
句柄获取的输出内容。
curl_multi_close
关闭批处理句柄
curl_multi_close ( resource $mh ) : void
mh
由
curl_multi_init()
返回的cURL
多个句柄。
关闭 cURL 批处理句柄。
没有返回值。
用法实例
$mh = curl_multi_init();
$chs = [];
for($i = 0; $i < 10; $i ++){
$chs[$i] = curl_init('http://demo.com/curl/Server/forMulti');
curl_setopt($chs[$i], CURLOPT_HEADER, 0);
curl_setopt($chs[$i], CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle($mh, $chs[$i]);
}
//开始执行--------------------------------------------------------
$running = null;
do {
$mrc = curl_multi_exec($mh, $running);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($running && $mrc == CURLM_OK) {
if ($c = curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $running);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
/*do {
curl_multi_exec($mh, $running);
} while ($running);*/
//执行完成--------------------------------------------------------
foreach ($chs as $ch) {
$contents[] = curl_multi_getcontent($ch);
curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
上例中如果使用注释部分来执行批处理,容易造成死循环,占用CPU资源:
/*do {
curl_multi_exec($mh, $running);
} while ($running);*/
优化后的方法利用 curl_multi_select
函数的阻塞机制,只在检测到活动连接时才继续。