Drupal的hook_cron执行顺序

5
Drupal 执行它的 _cron 钩子的顺序是怎样的?这对我正在开发的某个定制模块非常重要,但在网上似乎找不到任何相关文档。也许我搜索的关键词不对!
4个回答

9

2
UPDATE system SET weight='N' WHERE name='my_module'。对于需要后续执行的模块,将其放置在hook_install()中是一种常见做法,但您也可以轻松手动执行该操作。 - Grayside

2
您可以使用Supercron模块检查和调整cron执行顺序。以下是此模块的更多详细信息(来自其项目页面):
SuperCron是Drupal内置Cron功能的完整替代品,它允许您:
- 查看已启用模块中找到的所有Cron钩子的列表 - 更改调用cron钩子的顺序 - 禁用某些钩子 - 并行运行您选择的任务,以便cron任务将一次性执行而不是一个接一个地执行 - 识别各个钩子引发的异常 - 根据需要单独调用钩子(非常适合识别问题) - 保持执行跟随异常的cron钩子,将损坏限制为仅一个模块 - 测量cron钩子执行所需的时间(我们显示最后的调用时间和平均时间) - 捕获钩子生成的任何输出 - 更改站点负载时Cron的行为方式(此可选功能需要启用节流) - 限制允许调用您的cron脚本的IP地址

1

对于Drupal 8,您需要在hook_module_implements_alter中重新排列模块的实现顺序:

function YOUR_MODULE_module_implements_alter(&$implementations, $hook) {

  // Move our hook_cron() implementation to the end of the list.
  if ($hook == 'cron') {
    $group = $implementations['YOUR_MODULE'];
    unset($implementations['YOUR_MODULE']);
    $implementations['YOUR_MODULE'] = $group;
  }
}

如果您想首先调用您的hook_cron
function YOUR_MODULE_module_implements_alter(&$implementations, $hook) {

  // Move our hook_cron() implementation to the top of the list.
  if ($hook == 'cron') {
    $group = $implementations['YOUR_MODULE'];
    $implementations = [
      'YOUR_MODULE' => $group,
    ] + $implementations;
  }
}

0

钩子的执行顺序由实现它们的模块的权重决定;权重较大的模块将最后执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接