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