|
Batch API 是用来解决当你某个页面的执行时间过长而引起的超时问题。 假设你一次性要处理1000个重复性动作(函数)而且它会超时,那么我们就可以利用batch api来将这1000次动作分解成数个动作,比如我们可以分成100个小动作,每个小动作处理10个,
当然你要确保每个小动作的执行时间不能超时。
关于$operations可以有两种定义方式:
一是在定义$batch时就用for循环定义好操作数组,这时主要就是利用$i来给具体操作函数传参使用。
二是只有一个操作函数,在操作函数里利用$context['sandbox']['progress']等相关引用变量来循环调用这个操作函数(具体使用参见专业指南23章),
这个可能比第一种方式考虑复杂些,所以建议尽量用第一种方式。
附件里是一个范例模块,我已经安装到本站中,所以大家可以直接访问这个地址来看效果哦:
http://www.incollege.cn/batch_example
把部分代码贴出来:
04 | function batch_example() { |
07 | $node_total_num = db_result(db_query("SELECT COUNT(nid) FROM {node}")); |
09 | for($i = 0; $i < $node_total_num; $i++) { |
11 | $operations[] = array('batch_example_load_node', array($i)); |
15 | 'operations' => $operations, |
16 | 'init_message' => '准备开始加载...', |
17 | 'finished' => 'batch_example_finished', |
19 | 'progress_message' => '当前加载了 @current / @total', |
20 | 'error_message' => '加载过程出现错误!', |
30 | function batch_example_load_node($i, &$context) { |
32 | $current_node_title = db_result(db_query_range("SELECT title FROM {node}", $i, 1)); |
35 | $context['results'][] = $current_node_title; |
38 | $context['message'] = '正在加载: '.$current_node_title; |
型动视觉摘自似水流云的博客,谢谢! |