Batch API 实例模块

.Mon, 04/25/2011 - 23:30

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);
}

 

AttachmentSize
batch_example.rar1.29 KB