예제 #1
0
 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;
 }