web-dev-qa-db-ja.com

3か月ごとに関数を実行するにはどうすればよいですか?

3か月ごとに関数を実行する適切な方法は何ですか?ウォッチドッグ変数は、一定の時間が経過すると利用できないようです。別のテーブルを作成して、実行関数の日付を挿入して比較することもできますが、それが最善の方法ではないようです。

このような関数の機能は次のとおりです。

  • メールを送る
  • 非アクティブなユーザーにタグを付ける
4
Alex js

watchdog() はストレージに適切な場所ではありません。 _$variables_パラメータは、変数データの表示をフォーマットするためのものです(例:[〜#〜] username [〜#〜]in "User [〜#〜]ユーザー名[〜#〜]がログインしました ")、アプリケーションデータの長期保存用ではありません。

代わりに、 hook_cron() と永続変数関数( variable_get()variable_set() )最後に実行された日時を記憶するcronタスクを実行します。

_/**
 * Implements hook_cron().
 */
function MYMODULE_cron() {

  // Look up last time MYMODULE_function() was run compared to 3 months ago.
  if (variable_get('MYMODULE_function_last_run', 0) <= strtotime('-3 month')) {
     // Run my function
     MYMODULE_function();

     //Store the time when MYMODULE_function() was last run.
     variable_set('MYMODULE_function_last_run', time());
  }
}
_
4
Shawn Conn

Rules モジュールとRules Scheduler(そのサブモジュール)は、sending eMails(質問の下のコメントのように)、以下の手順で説明します。

ステップ1:「次の更新」日を格納するフィールドを作成する

マシン名(たとえば)field_next_renewalを使用して、「user」エンティティにフィールドを追加します。 1つの日付のみを許可します(一部のユーザーにメールを送信するための「次の」日付を格納するために、たとえば一部の更新について)。

ステップ2:ルール「コンポーネント」を作成する

作成されるルールComponentは次のとおりです(ルールのエクスポート形式で、コピーと貼り付けを介して独自の環境にインポートするだけです):

{ "rules_send_email_notification" : {
    "LABEL" : "Send eMail notification",
    "PLUGIN" : "action set",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "USES VARIABLES" : { "user_to_notify" : { "label" : "User to be notified", "type" : "user" } },
    "ACTION SET" : [
      { "mail" : {
          "to" : [ "user-to-notify:mail" ],
          "subject" : "Reminder about your next renewal",
          "message" : "This is a reminder about your next renewal on [user-to-notify:field_next_renewal] ...",
          "from" : "[site:mail]",
          "language" : [ "" ]
        }
      }
    ]
  }
}

明らかに、メールのSubjectおよびContentのレビューが必要な場合があります/チューニング。ただし、他のFrom電子メールIDを使用することもできます。

ステップ3:ルールコンポーネントを使用して「ルール」を作成する

作成するRuleRules エクスポート形式で示します(コピーして貼り付けて独自の環境にインポートするだけです)。

{ "rules_email_user_every_3_months" : {
    "LABEL" : "eMail user every 3 months",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "rules_scheduler" ],
    "ON" : { "user_insert" : [] },
    "IF" : [
      { "entity_has_field" : { "entity" : [ "account" ], "field" : "field_next_renewal" } }
    ],
    "DO" : [
      { "data_set" : { "data" : [ "account:field-next-renewal" ], "value" : "+6 month" } },
      { "schedule" : {
          "component" : "rules_send_email_notification",
          "date" : {
            "select" : "account:field-next-renewal",
            "date_offset" : { "value" : 7776000 }
          },
          "identifier" : "[account:name]",
          "param_user_to_notify" : [ "account" ]
        }
      }
    ]
  }
}

上記のルールは、前のステップのRules Componentを参照しています。

7776000は3か月の秒数に相当することに注意してください。あなたはそれを少し減らしたいかもしれません、例えば。秒数は数日(または1週間程度)に相当します。これにより、実際の更新の数日前にメールが送信されます。

ステップ4:非アクティブなユーザーにタグを付ける

手順3のルールと同様の追加のルールを作成することにより、 Flag モジュールと Rules の統合を使用して、非アクティブなユーザーに「フラグを立てる」こともできます。 このようなユーザーにタグを付ける(質問の下のコメントにあるように)の解決策でもあります。それについて残っている唯一の課題は、「inactive」ユーザーを識別するルール条件を見つけることです。

2
Pierre.Vriens