Batch API 是用来解决当你某个页面的执行时间过长而引起的超时问题。
假设你一次性要处理1000个重复性动作(函数)而且它会超时,那么我们就可以利用batch api来将这1000次动作分解成数个动作,比如我们可以分成100个小动作,每个小动作处理10个,当然你要确保每个小动作的执行时间不能超时。
关于$operations可以有两种定义方式,一是在定义$batch时就用for循环定义好操作数组,这时主要就是利用$i来给具体操作函数传参使用。二是只有一个操作函数,在操作函数里利用$context['sandbox']['progress']等相关引用变量来循环调用这个操作函数(具体使用参见专业指南23章),这个可能比第一种方式考虑复杂些,所以建议尽量用第一种方式。
附件里是一个范例模块,我已经安装到本站中,所以大家可以直接访问这个地址来看效果哦:
http://www.incollege.cn/batch_example
把部分代码贴出来:
/**
* Page callback of menu - 'batch_example'.
*/
function batch_example() {
$oprations = array();
// 计算总的节点数量
$node_total_num = db_result(db_query("SELECT COUNT(nid) FROM {node}"));
for($i = 0; $i < $node_total_num; $i++) {
// $i将作为参数传给db_query_range,用来按顺序取得相应的节点
$operations[] = array('batch_example_load_node', array($i));
}
$batch = array(
'operations' => $operations,
'init_message' => '准备开始加载...',
'finished' => 'batch_example_finished',
'title' => '加载节点:',
'progress_message' => '当前加载了 @current / @total',
'error_message' => '加载过程出现错误!',
);
batch_set($batch);
batch_process();
}
/**
* 具体操作处理函数
*/
function batch_example_load_node($i, &$context) {
// 获取当前正在加载的节点标题
$current_node_title = db_result(db_query_range("SELECT title FROM {node}", $i, 1));
// 收集结果集
$context['results'][] = $current_node_title;
// 显示当前处理信息
$context['message'] = '正在加载: '.$current_node_title;
// 延迟一会
sleep(1);
}
| Attachment | Size |
|---|---|
| batch_example.rar | 1.29 KB |
