Piwik プラットフォームを導入-スケジュールされたタスクを作成する方法
ここではブログのシリーズの次のポスト Piwik プラットフォームの機能を紹介します(以前の記事は Piwik でカスタム テーマを作成する方法)。
今回は毎日の電子メールを送信する、例えば、バックグラウンドでスケジュールされたタスクを実行する方法を学びます。このチュートリアルは、PHP の基本的な知識を持っている必要があります。
スケジュールされたタスクでは何ができるでしょうか?
スケジュールされたタスクは、定期的にタスクを実行させることができます (1 時間ごと、毎週…)。たとえば次のことができます:
- カスタムレポートとサマリーの作成及び送信
- 他のシステムによる同期ユーザーとウェブサイト
- 全てのキャッシュのクリア
- Piwik のサード パーティのデータをインポートします。
- Piwik インスタンスを監視します。
- その他のタスクの実行
はじめに
このシリーズでは、すでに開発環境を設定していることを前提としています。まだの場合は、Piwik の開発者サイトにアクセスし、セットアップチュートリアルを探してください。
セットアップを完了するためにしなければならない事を要約すると:
- Piwik をインストールします(例えば git を経由して)
- 開発者モードを起動します。:
./console development:enable --full。 - プラグインを生成します:
./console generate:plugin --name="MyTasksPlugin"APIとコントローラを生成するか聞かれたらnを押して下さい。フォルダーのplugins/MyTasksPluginにしてください。 - 作成されたプラグインを有効にします。設定 => Plugins。
スケジュールされたタスクを作成してみましょう
Piwikコンソールを使用しタスクテンプレートを作成します。
./console generate:scheduledtask
このコマンドで、タスクが所属すべきプラグインの名前を入力するように要求されます。そのまま上記で生成されるプラグイン名「MyTasksPlugin」を使います。簡単に始められるようにいくつかの例が含まれているファイルのpligins/MyTasksPlugin/Tasks.phpがあるはずです。
class Tasks extends \Piwik\Plugin\Tasks
{
public function schedule()
{
$this->hourly('myTask'); // method will be executed once every hour
$this->daily('myTask'); // method will be executed once every day
$this->weekly('myTask'); // method will be executed once every week
$this->monthly('myTask'); // method will be executed once every month
// pass a parameter to the task
$this->weekly('myTaskWithParam', 'anystring');
// specify a different priority
$this->monthly('myTask', null, self::LOWEST_PRIORITY);
$this->monthly('myTaskWithParam', 'anystring', self::HIGH_PRIORITY);
}
public function myTask()
{
// do something
}
public function myTaskWithParam($param)
{
// do something
}
}
簡単な例
生成されたテンプレートで見ることができるタスク 1 時間ごと、毎日、毎週、毎月を実際のタスクを表すメソッドを登録することによって実行できます:
public function schedule()
{
// register method remindMeToLogIn to be executed once every day
$this->daily('remindMeToLogIn');
}
public function remindMeToLogIn()
{
$mail = new \Piwik\Mail();
$mail->addTo('me@example.com');
$mail->setSubject('Check stats');
$mail->setBodyText('Log into your Piwik instance and check your stats!');
$mail->send();
}
この例ではメールを送信 1 日 1 回毎日あなたが Piwik にログインするように促します。Piwik プラットフォーム メソッド remindMeToLogIn を毎日 1 回だけ実行するようにします。
タスクにパラメーターを渡す方法
タスク メソッドにパラメーターを渡したい場合。これは web サイトごとまたはユーザーごとの 1 つのタスク インスタンスを登録する場合に便利です。これを実行するメソッドを登録するときに 2 番目のパラメーターを指定することによって実現できます。
public function schedule()
{
foreach (\Piwik\Site::getSites() as $site) {
// create one task for each site and pass the URL of each site to the task
$this->hourly('pingSite', $site['main_url']);
}
}
public function pingSite($siteMainUrl)
{
file_get_contents($siteMainUrl);
}
スケジュールされたタスクをテストする方法
タスクを作った後、それをどのようにテストするのか、きっと疑問に思っていることでしょう。最初に、今後のブログ記事のいずれかでカバーするユニットや統合テストを記述する必要があります。1 つだけヒント: ./console generate:testコマンドを使用するるとテストを作成することができます。すべてのスケジュールされたタスクを手動で実行するには、お使いのブラウザーで次のURLを開くと、 API メソッド CoreAdminHome.runScheduledTasksを実行します。
http://piwik.example.com/index.php?module=API&method=CoreAdminHome.runScheduledTasks&token_auth=YOUR_API_TOKEN
ドメインおよび token_auth の URL パラメーターを交換することを忘れないでください。
スケジュールされたタスクを実行することで一つの問題があります:プラットフォームは一日、または一時間に一回実行することを確認します。これは、単にURLをリロードして、次の1時間または日にならないと、何度も何度もメソッドをテストできないことを意味します。適切なソリューションは、定数 DEBUG_FORCE_SCHEDULED_TASKS を Core/TaskScheduler.php ファイル内で true に設定します。テストが完了したら再び設定を false に戻すことを忘れないでください。
Piwik2.6.0からスタートすると、代わりに次のコマンドを実行することができます。
./console core:run-scheduled-tasks --force --token-auth=YOUR_TOKEN_AUTH
オプション”-force”この時点で実行する予定のないタスクを実行することが確認されます。任意のファイルを変更する必要はありません。
どのタスクが登録されますか、そしてタスクの次の実行時間はいつですか?
マーケットプ レースの TasksTimetable プラグインはこの質問に答えることができます。インストールして、[設定]に移動、ワンクリックでプラグインを有効にする=>マーケットプレース=>新しい機能を取得します。これで、[設定]の中に新しい admin メニュー項目”スケジュールされたタスク”が追加されます。
マーケットプ レースであなたのプラグインを公開
他の Piwik ユーザーとテーマを共有したい場合、GitHub であなたのテーマをプッシュして、タグを作成することで、簡単におこなえます。テーマを配布する方法については、こちらをご覧ください。
高度な機能
スケジュールされたタスクを作成するのは難しいですか?私たちも、ファイルを作成したことはありません!もちろん、「我々 の API の複雑さは使用ケースの複雑さを超えてはならない」というデザイン理念に基づくAPIを実現したいと考えています。たとえば、優先順位を定義することができます、異なるオブジェクトおよびクラスからのメソッドを直接登録することができます。その日の時点で、タスクを実行して詳細を指定できます。
タスクの詳細を知りたいですか? Piwik の開発者ゾーンで私たちのタスククラス参照に移動します。
APIまたはDeveloper Zoneにおける手引きに関してのフィードバックはお気軽にお寄せ下さい。
Thomas Steur