Created
May 25, 2011 16:02
-
-
Save bmatheny/991247 to your computer and use it in GitHub Desktop.
curl_multi speed for PHP
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class CurlMulti | |
{ | |
// Code from http://www.somacon.com/p537.php | |
public static function getMulti(array $urls) | |
{ | |
// Create get requests for each URL | |
$mh = curl_multi_init(); | |
foreach($urls as $i => $url) | |
{ | |
$ch[$i] = curl_init($url); | |
curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, 1); | |
curl_multi_add_handle($mh, $ch[$i]); | |
} | |
// Start performing the request | |
do { | |
$execReturnValue = curl_multi_exec($mh, $runningHandles); | |
} while ($execReturnValue == CURLM_CALL_MULTI_PERFORM); | |
// Loop and continue processing the request | |
while ($runningHandles && $execReturnValue == CURLM_OK) { | |
// Wait forever for network | |
$numberReady = curl_multi_select($mh); | |
if ($numberReady != -1) { | |
// Pull in any new data, or at least handle timeouts | |
do { | |
$execReturnValue = curl_multi_exec($mh, $runningHandles); | |
} while ($execReturnValue == CURLM_CALL_MULTI_PERFORM); | |
} | |
} | |
// Check for any errors | |
if ($execReturnValue != CURLM_OK) { | |
trigger_error("Curl multi read error $execReturnValue\n", E_USER_WARNING); | |
} | |
// Extract the content | |
foreach($urls as $i => $url) | |
{ | |
// Check for errors | |
$curlError = curl_error($ch[$i]); | |
if($curlError == "") { | |
$res[$i] = curl_multi_getcontent($ch[$i]); | |
} else { | |
print "Curl error on handle $i: $curlError\n"; | |
} | |
// Remove and close the handle | |
curl_multi_remove_handle($mh, $ch[$i]); | |
curl_close($ch[$i]); | |
} | |
// Clean up the curl_multi handle | |
curl_multi_close($mh); | |
// Print the response data | |
return $res; | |
} | |
// Code from http://www.php.net/manual/en/function.curl-multi-exec.php | |
public static function getMulti2($url) { | |
// create both cURL resources | |
$ch1 = curl_init(); | |
// set URL and other appropriate options | |
curl_setopt($ch1, CURLOPT_URL, $url); | |
curl_setopt($ch1, CURLOPT_HEADER, 0); | |
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1); | |
//create the multiple cURL handle | |
$mh = curl_multi_init(); | |
//add the two handles | |
curl_multi_add_handle($mh,$ch1); | |
$active = null; | |
//execute the handles | |
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); | |
} | |
} | |
//close the handles | |
$content = curl_multi_getcontent($ch1); | |
curl_multi_remove_handle($mh, $ch1); | |
curl_multi_close($mh); | |
return $content; | |
} | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment