summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Gass2012-11-19 14:27:26 +0000
committerNathan Gass2012-11-19 14:27:26 +0000
commit8ff4483ee69aafbe1cb62a96d5dcd7ce20138220 (patch)
treeff8039ad96ac0735235d0e5498fe2f7df0b8684e
parent2a53ba3b973e650bfc48688e7f87a9d4c4010f8e (diff)
downloaditools-8ff4483ee69aafbe1cb62a96d5dcd7ce20138220.tar.gz
itools-8ff4483ee69aafbe1cb62a96d5dcd7ce20138220.tar.bz2
itools-8ff4483ee69aafbe1cb62a96d5dcd7ce20138220.zip
allow handler function per url which can abort in get_multi
-rw-r--r--it_url.class38
1 files changed, 23 insertions, 15 deletions
diff --git a/it_url.class b/it_url.class
index 1e61578..2739ba4 100644
--- a/it_url.class
+++ b/it_url.class
@@ -381,13 +381,18 @@ function get_multi($p=null)
);
$mh = curl_multi_init();
+ $urls = array();
foreach ($p['urls'] as $key => $url)
+ $urls[$key] = is_array($url) ? $url : array('url' => $url);
+
+ foreach ($urls as $key => $url)
{
- $ch[$key] = curl_init();
- curl_setopt($ch[$key], CURLOPT_URL, $url);
- curl_setopt_array($ch[$key], $opts);
- curl_multi_add_handle($mh, $ch[$key]);
- $keys[$ch[$key]] = $key;
+ $handle = curl_init();
+ curl_setopt($handle, CURLOPT_URL, $url['url']);
+ curl_setopt_array($handle, $opts);
+ curl_multi_add_handle($mh, $handle);
+ $keys[$handle] = $key;
+ $handles[$key] = $handle;
}
$start = microtime(true);
@@ -398,8 +403,9 @@ function get_multi($p=null)
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
+ $results = array();
$timeout = 0.001; # Very short timeout to work around problem with first select call on cURL 7.25.0
- while ($active && $mrc == CURLM_OK)
+ while (!$abort && $active && $mrc == CURLM_OK)
{
if (curl_multi_select($mh, $timeout) != -1)
{
@@ -410,9 +416,14 @@ function get_multi($p=null)
{
if ($info['msg'] == CURLMSG_DONE)
{
- EDC('reqtimings', $keys[$info['handle']], $info['result'], (microtime(true) - $start) * 1000);
- if ($info['result'] != CURLE_OK)
- $error[$info['handle']] = $info['result'];
+ $key = $keys[$info['handle']];
+ EDC('reqtimings', $key, $info['result'], (microtime(true) - $start) * 1000);
+ if ($info['result'] == CURLE_OK)
+ $results[$key] = curl_multi_getcontent($info['handle']);
+ else
+ $results[$key] = false;
+ if (($handler = $urls[$keys[$info['handle']]]['handler']))
+ $abort = $handler($info['result'], $results[$key]);
}
}
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
@@ -420,12 +431,9 @@ function get_multi($p=null)
$timeout = 0.1; # Longer delay to avoid busy loop but shorter than default of 1s in case we stil hit cURL 7.25.0 problem
}
- $results = array();
- foreach ($p['urls'] as $key => $url)
- {
- $results[$key] = $error[$ch[$key]] ? false : curl_multi_getcontent($ch[$key]);
- curl_multi_remove_handle($mh, $ch[$key]);
- curl_close($ch[$key]);
+ foreach ($handles as $key => $handle) {
+ curl_multi_remove_handle($mh, $handle);
+ curl_close($handle);
}
curl_multi_close($mh);
return $results;