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 函数的阻塞机制,只在检测到活动连接时才继续。