国外设计欣赏网站 - DOOOOR.com

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索

[Drupal模块] Drupal:Batch API 实例模块

[复制链接]
发表于 1-14-2012 00:33 | 显示全部楼层 |阅读模式

Batch API 是用来解决当你某个页面的执行时间过长而引起的超时问题。

假设你一次性要处理1000个重复性动作(函数)而且它会超时,那么我们就可以利用batch api来将这1000次动作分解成数个动作,比如我们可以分成100个小动作,每个小动作处理10个,


当然你要确保每个小动作的执行时间不能超时。


关于$operations可以有两种定义方式:


一是在定义$batch时就用for循环定义好操作数组,这时主要就是利用$i来给具体操作函数传参使用。


二是只有一个操作函数,在操作函数里利用$context['sandbox']['progress']等相关引用变量来循环调用这个操作函数(具体使用参见专业指南23章),


这个可能比第一种方式考虑复杂些,所以建议尽量用第一种方式。


附件里是一个范例模块,我已经安装到本站中,所以大家可以直接访问这个地址来看效果哦:


http://www.incollege.cn/batch_example


把部分代码贴出来:


01/**
02 * Page callback of menu - 'batch_example'.
03 */
04function batch_example() {
05    $oprations array();
06  // 计算总的节点数量
07  $node_total_num = db_result(db_query("SELECT COUNT(nid) FROM {node}"));
08   
09  for($i = 0; $i $node_total_num$i++) {
10    // $i将作为参数传给db_query_range,用来按顺序取得相应的节点
11        $operations[] = array('batch_example_load_node'array($i));
12  }
13 
14  $batch array(
15    'operations' => $operations,
16    'init_message' => '准备开始加载...',
17    'finished' => 'batch_example_finished',
18    'title' => '加载节点:',
19    'progress_message' => '当前加载了 @current / @total',
20    'error_message' => '加载过程出现错误!',
21  );
22 
23  batch_set($batch);
24  batch_process();
25}
26 
27/**
28 * 具体操作处理函数
29 */
30function batch_example_load_node($i, &$context) {
31  // 获取当前正在加载的节点标题
32  $current_node_title = db_result(db_query_range("SELECT title FROM {node}"$i, 1));
33   
34  // 收集结果集
35  $context['results'][] = $current_node_title;
36 
37  // 显示当前处理信息
38  $context['message'] = '正在加载: '.$current_node_title;
39 
40  // 延迟一会
41  sleep(1);
42}



型动视觉摘自似水流云的博客,谢谢!

|2011-2026-版权声明|平台(网站)公约|DOOOOR 设计网 ( 吉ICP备2022003869号 )

GMT+8, 2-21-2025 07:45 , Processed in 1.010877 second(s), 206 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表