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 ; |
型动视觉摘自似水流云的博客,谢谢! |