開発
Drupal
Drupal8

Drupal8のカスタムモジュールをcronに対応させるメモ

More than 1 year has passed since last update.

自作モジュールをcronに対応させて、定期的な処理を実行する手順をメモする。
モジュール名は First Module とし、記述を進める。

DRUPAL/modules/custom/
├first_module/
│├first_module.info.yml

cronに対応させる2段階のステップ

カスタムモジュールをcronに対応させるには2つのステップが必要となる。

  1. Drupalでcronが実行された際にキューに処理を登録する処理
  2. 生成されたキューを実行する処理

これらの手順を意識すれば、カスタムモジュールのcron対応は案外簡単に実装出来る。ただし、一つ整理しておかなければならないことがある。それは、上記のステップのうち定期実行によって処理されるのは後者であるということ。前者はcronとは関係ない。要するにcron実行時に限らず、キューへの処理登録は随時行えば良い。cron実行時には登録されているキューを随時処理していくという流れになる。

キューにデータを登録

cron実行時に処理されるキューを登録する。記述は意外と単純。

  $queue = \Drupal::queue('first_module_queue');
  $data = [ 'value' => 'test'];
  $queue->createItem($data);

で良い。この処理をカスタムモジュールのいずれかのタイミングで実行することでキューが登録される。

ここで、1行目で指定している first_module_queue はQueueIDと言うもので、どのキューにデータを登録するかの識別子となる。

混乱しかねないのでイメージだけ共有しておきたい。そもそもキューとは、 高速道路における料金所の各ゲート だと考える。そしてデータは、 各ゲートに並んだ車 ということになる。どのキューにデータを登録するのかは、キューの識別子であるQueueIDを用いることになる。キューに登録されたデータは、 登録された順 でキューによって処理される。

上記3行の記述はは次のように解釈できる。
1行目でどのキューを利用するのか指定した。続いて登録する処理に必要なデータを用意する(2行目)。データをキューに登録する(3行目)という流れになる。

キューの処理

QueueIDによって選択されたキューにデータを登録することで、cron実行時に登録済みのデータが処理される。
ここではQueueIDと対応するキューの作成を行う。前節の例で言うならば、料金所におけるゲートと通過する際の処理を定義することになる。

ソースコードは FirstModuleQueueWorker.php とし、 src/Plugin/QueueWorker に配置する。

DRUPAL/modules/custom/
├first_module/
│├first_module.info.yml
│├src/
││├Plugin/
│││├QueueWorker/
││││├FirstModuleQueueWorker.php

FirstModuleQueueWorker.php

FirstModuleQueueWorker.phpはキューとその処理を定義する。

  • src/Plugin/QueueWorker/ に配置する。
  • \Drupal\Core\Queue\QueueWorkerBase を継承したクラスにする。
  • QueueIDを持つ。
  • キューの処理は、 public function processItem($data){} として定義する。
FirstModuleQueueWorker.php
<?php

namespace Drupal\first_module\Plugin\QueueWorker;
use Drupal\Core\Queue\QueueWorkerBase;

/**
 * Processes for First Module Queue.
 *
 * @QueueWorker(
 *   id = "first_module_queue",
 *   title = @Translation("FirstModuleQueueWorker"),
 *   cron = {"time" = 60}
 * )
 */

class FirstModuleQueueWorker extends QueueWorkerBase {

  /**
   * {@inheritdoc}
   */
  public function processItem($data) {
    // Process $data here.
    \Drupal::logger('first_module')->notice('run processItem@FirstModuleQueueWorker');

  }
}

キューにデータが登録されていると、cronが呼び出された際にprocessItem($data)が呼び出される。引数の$dataは、前節のプログラムにあった$queue->createItem($data);によって登録された$dataとなる。

上記のプログラムでは$dataは特に利用せず、キューが処理を実施した場合にメッセージをログに残すだけのプログラムとなっている。