function loadm($connomains, $p = array()) { $mh = curl_multi_init(); foreach ($connomains as $i => $url) { $conn[$i] = curl_init($url); // Setup connection settings $configs = isset($p["setup"]) ? call_user_func($p["setup"], $i, $url) : array(); xurl::_setopts($conn[$i], array_merge($p, $configs)); curl_multi_add_handle($mh, $conn[$i]); } // Start performing the request do { $mrc = curl_multi_exec($mh, $active); if (isset($p["waitbefore"]) && $p["waitbefore"] > 0) { usleep($p["waitbefore"] * 1000000); } } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active and $mrc == CURLM_OK) { // wait for network if (curl_multi_select($mh) != -1) { // pull in any new data, or at least handle timeouts do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } if ($mrc != CURLM_OK) { trigger_error("Curl multi read error {$mrc}\n", E_USER_WARNING); } // retrieve data foreach ($connomains as $i => $url) { if (($err = curl_error($conn[$i])) == '') { $res[$i] = curl_multi_getcontent($conn[$i]); } else { trigger_error("Curl error on handle {$i}: {$err}\n", E_USER_WARNING); } curl_multi_remove_handle($mh, $conn[$i]); curl_close($conn[$i]); } curl_multi_close($mh); return $res; }