You are here

Drupal专业开发指南 第23章 使用批处理API

g089h515r806 的头像
Submitted by g089h515r806 on 星期五, 2009-09-04 11:28

使用批处理API

    有时,你需要运行一系列的任务,这可能需要很长时间----有可能会超过PHP的时间限制。幸运的是,Drupal提供了一个API用来专门处理这种情况。你只需要指定要做什么,接着将它委托给批处理的处理器。这一般在一个表单提交后执行,当然这不是必须的。我们将检查在安装器中是如何使用批处理API的,接着学习一下如何在表单提交中使用批处理API。
 
使用批处理API启用模块
    隐藏在批处理API背后的基本思想是,你定义一组操作,定义用来显示进度消息的一些信息,定义如何运行这些操作,接着将其委托给批处理引擎。引擎将负责执行这些操作,如果需要的话,还会刷新HTTP,更新进度指示器。接着,当所有的操作执行完毕后,它将调用你定义的最终函数。
    下面是安装器使用批处理API启用模块的简化版本:
$operations = array();
foreach ($modules as $module) {
    $operations[] = array(
        '_install_module_batch', // Name of callback.
        array($module, $files[$module]->info['name']), // Array of parameters.
    );
}
$batch = array(
    'operations' => $operations,
    'finished' => '_install_profile_batch_finished', // Call this when done.
    'title' => st('Installing @drupal', array(
        '@drupal' => drupal_install_profile_name())
    ),
    'error_message' => st('The installation has encountered an error.'),
);
batch_set($batch);
batch_process($url, $url);
 
    首先,它创建了一个操作数组。每个操作都包含了,要调用的PHP函数的名字,和传递过来的参数的数组。由于在处理进行时,安装器将在后面调用这个PHP函数,所以它又被称为回调
    接着,定义了一个批处理集。这里面有,包含操作的数组,处理完成后要调用的回调的名字,在处理期间使用的标题,还有当出现错误时使用的错误消息。使用batch_set()来检验批处理集,接着调用batch_process()开始处理。
 
提示在这种情况下,所有的操作都调用了同一个函数,这里仅仅使用了不同的参数。然而,操作可以是你想要调用的任意函数。
 
    面是来自于install.php的_install_module_batch()函数的代码,对于每个操作都会执行这段代码:
 
/**
 * Batch callback for batch installation of modules.
 */
function _install_module_batch($module, $module_name, &$context) {
    _drupal_install_module($module);
    // We enable the installed module right away, so that the module will be
    // loaded by drupal_bootstrap() in subsequent batch requests, and other
    // modules possibly depending on it can safely perform their installation
    // steps.
    module_enable(array($module));
    $context['results'][] = $module;
    $context['message'] = 'Installed '. $module_name .' module.';
}

Drupal版本: