function httprl_batch_callback in HTTP Parallel Request & Threading Library 6
Same name and namespace in other branches
- 7 httprl.module \httprl_batch_callback()
Given an array of data, use multiple processes to crunch it.
Similar to Map Reduce.
Parameters
$callback: The function to run
$data: The data to process.
Return value
Array of returned results.
See also
http://php.net/array-chunk#63394
1 call to httprl_batch_callback()
- httprl.examples.php in examples/
httprl.examples.php - HTTP Parallel Request Library code examples.
File
- ./
httprl.module, line 3409 - HTTP Parallel Request Library module.
Code
function httprl_batch_callback($callback, $data, $options = array()) {
// Set defaults.
$results = array();
$unified_result = NULL;
$number_of_items = count($data);
$options += array(
'max_batchsize' => 30,
'threads' => 3,
'timeout' => 120,
'multiple_helper' => FALSE,
);
// Shrink batchsize to evenly distribute workload if needed.
if ($number_of_items < $options['max_batchsize'] * $options['threads']) {
$options['max_batchsize'] = ceil($number_of_items / $options['threads']);
}
// Chunk the data.
$data = array_chunk($data, $options['max_batchsize'], TRUE);
// Convert options to httprl_queue_background_callback options.
unset($options['max_batchsize']);
$options['domain_connections'] = $options['threads'];
unset($options['threads']);
$multiple = $options['multiple_helper'];
unset($options['multiple_helper']);
// Queue up the processes.
if ($multiple) {
foreach ($data as $key => $values) {
$results[$key] =& httprl_qcinp('httprl_run_multiple', array(
$callback,
$values,
), TRUE, $options);
}
}
else {
foreach ($data as $key => $values) {
$results[$key] =& httprl_qcinp($callback, array(
$values,
), TRUE, $options);
}
}
// Execute in parallel.
httprl_send_request();
// Try to merge the results into one.
$unified = TRUE;
$is_assoc = TRUE;
foreach ($results as $key => $value) {
if (is_null($unified_result)) {
$unified_result = $results[$key];
}
elseif (is_string($results[$key]) && is_string($unified_result)) {
$unified_result .= $results[$key];
}
elseif (is_array($results[$key]) && is_array($unified_result)) {
if ($is_assoc && httprl_is_array_assoc($results[$key]) && httprl_is_array_assoc($unified_result)) {
$unified_result = httprl_lossless_assoc_array_merge($unified_result, $results[$key]);
}
else {
$is_assoc = FALSE;
$unified_result += $results[$key];
}
}
else {
$unified = FALSE;
break;
}
}
// Return results.
if ($unified) {
return $unified_result;
}
else {
return $results;
}
}