note 109377 modified in function.curl-multi-exec by danbrown
| From: | danbrown@php.net | Date: | Mon, 16 Jul 2012 15:36:08 +0000 |
| Subject: | note 109377 modified in function.curl-multi-exec by danbrown | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-189189@lists.php.net to get a copy of this message | ||
This function wait for the last page, can get a configuration array with curl options to made a
post, or pass timeouts, etc. Retun the same array but add "error",
and "data".Error is the string destription if something fail, data is the
response. <?php // author: Daniel G
Zylberberg // date 11 jul 2012 // $res: array with structure
0=>array("url"=>"blah"),1=>array("url"=>"some
url") // $options (optional): array with curl options (timeout, postfields,
etc) // return the same array that gets, and add "data" to the
current row(html content) // and "error", with the string
description in the case that something fail. function
multiCurl($res,$options=""){
if(count($res)<=0) return False; $handles =
array(); if(!$options) // add default
options $options = array(
CURLOPT_HEADER=>0,
CURLOPT_RETURNTRANSFER=>1,
); // add curl options to each handle
foreach($res as $k=>$row){ $ch{$k} =
curl_init(); $options[CURLOPT_URL] =
$row['url']; curl_setopt_array($ch{$k},
$options); $handles[$k] = $ch{$k};
} $mh = curl_multi_init();
foreach($handles as $k =>
$handle){ curl_multi_add_handle($mh,$handle);
//echo "<br>adding handle {$k}";
} $running_handles = null;
//execute the handles do { $status_cme =
curl_multi_exec($mh, $running_handles); } while ($cme ==
CURLM_CALL_MULTI_PERFORM); while ($running_handles
&& $status_cme == CURLM_OK) { if
(curl_multi_select($mh) != -1) { do {
$status_cme = curl_multi_exec($mh, $running_handles); //
echo "<br>''threads'' running =
{$running_handles}"; } while ($status ==
CURLM_CALL_MULTI_PERFORM); }
} foreach($res as $k=>$row){
$res[$k]['error'] = curl_error($handles[$k]);
if(!empty($res[$k]['error']))
$res[$k]['data'] = '';
else $res[$k]['data'] = curl_multi_getcontent(
$handles[$k] ); // get results // close current
handler curl_multi_remove_handle($mh, $handles[$k] );
} curl_multi_close($mh); return $res; //
return response } $res =
array(
"11"=>array("url"=>"http://localhost/public_html/test/sleep.php?t=1"),
"13"=>array("url"=>"http://localhost/public_html/test/sleep.php?t=3"),
"25"=>array("url"=>"this
doesn't exist"), ); print_r(
multiCurl($res)); ?> ----------
sleep.php
------------------------------------- <?php sleep($_GET['t']); echo
"sleep for {$_GET['t']} seconds and show
this."; ?>
--was--
This function wait for the last page, can get a configuration array with curl options to made a
post, or pass timeouts, etc.
Retun the same array but add "error", and "data".Error is the string destription
if something fail, data is the response.
<?
// author: Daniel G Zylberberg
// date 11 jul 2012
// $res: array with structure
0=>array("url"=>"blah"),1=>array("url"=>"some
url")
// $options (optional): array with curl options (timeout, postfields, etc)
// return the same array that gets, and add "data" to the current row(html content)
// and "error", with the string description in the case that something fail.
function multiCurl($res,$options=""){
if(count($res)<=0) return False;
$handles = array();
if(!$options) // add default options
$options = array(
CURLOPT_HEADER=>0,
CURLOPT_RETURNTRANSFER=>1,
);
// add curl options to each handle
foreach($res as $k=>$row){
$ch{$k} = curl_init();
$options[CURLOPT_URL] = $row['url'];
curl_setopt_array($ch{$k}, $options);
$handles[$k] = $ch{$k};
}
$mh = curl_multi_init();
foreach($handles as $k => $handle){
curl_multi_add_handle($mh,$handle);
//echo "<br>adding handle {$k}";
}
$running_handles = null;
//execute the handles
do {
$status_cme = curl_multi_exec($mh, $running_handles);
} while ($cme == CURLM_CALL_MULTI_PERFORM);
while ($running_handles && $status_cme == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$status_cme = curl_multi_exec($mh, $running_handles);
// echo "<br>''threads'' running =
{$running_handles}";
} while ($status == CURLM_CALL_MULTI_PERFORM);
}
}
foreach($res as $k=>$row){
$res[$k]['error'] = curl_error($handles[$k]);
if(!empty($res[$k]['error']))
$res[$k]['data'] = '';
else
$res[$k]['data'] = curl_multi_getcontent( $handles[$k] ); // get results
// close current handler
curl_multi_remove_handle($mh, $handles[$k] );
}
curl_multi_close($mh);
return $res; // return response
}
$res = array(
"11"=>array("url"=>"http://localhost/public_html/test/sleep.php?t=1"),
"13"=>array("url"=>"http://localhost/public_html/test/sleep.php?t=3"),
"25"=>array("url"=>"this doesn't exist"),
);
print_r( multiCurl($res));
?>
---------- sleep.php -------------------------------------
<?
sleep($_GET['t']);
echo "sleep for {$_GET['t']} seconds and show this.";
?>
http://php.net/manual/en/function.curl-multi-exec.php