长耗时批量数据处理 batch process

admin 提交于 周三, 06/07/2023 - 15:21
Batch API

Web 应用的运行是基于 http 请求触发的,如果在某一个表单提交后,有大量数据处理的任务, 很可能数据还没处理完成,请求就已经超时了,即使任务能脱离 http 请求继续在服务器进程上执行, 用户在浏览器端也没法得知任务的执行进度。

为了解决这个问题,Drupal 提供了 Batch API , 它把大量数据处理任务分成多个请求,每个请求只处理一部分的任务, 并提供了 Batch 进度表单,浏览器用户的感知是透明的,任务同样是持续执行,并且可以明确地看到处理进度。

Batch API 被设计与 Form API 协同工作,但在非表单页面,同样可以使用。

下面是一个简单的使用示例:

// 在表单提交处理器内添加如下代码
$batch = array(
  'title' => t('Exporting'),
  'operations' => array(
    array(
      'my_function_1',
      array(
        $account
          ->id(),
        'story',
      ),
    ),
    array(
      'my_function_2',
      array(),
    ),
  ),
  'finished' => 'my_finished_callback',
  'file' => 'path_to_file_containing_my_functions',
);
batch_set($batch);

// 如果在表单提交处理器内启用批处理,任务处理完成后,如自动跳转回到表单页面,或者表单提交完成后要跳转的页面。
// 如果不在表单页面使用批处理,需要添加此行,开始执行批处理任务,并(可选)指定完成处理任务后,需要跳转到的页面地址。
batch_process('node/1');