curl_multi_init、curl_multi_add_handle、curl_multi_execcurl_multi_getcontent、curl_multi_info_read、curl_multi_selectcurl_multi_remove_handle、curl_multi_closecurl_multi_init 建立批次處理控制代碼curl_init 建立子 handle,curl_setopt 設定 URL/選項,curl_multi_add_handle 加入批次curl_multi_exec 執行curl_multi_getcontent 取得結果curl_multi_remove_handle 移除子 handle,curl_close 關閉curl_multi_close 關閉批次控制代碼do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
原始 do-while 為忙等待,導致 CPU 滿載。
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
curl_multi_select 會阻塞直到有資料可讀或逾時,大幅降低 CPU 佔用。
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout) 在 add_handle 前設定curl_error($ch) 在 getcontent 前檢查