PHP
FuelPHP

[FuelPHP]cron用のtaskを活用していちいちmysqlを叩かずにデータを挿入する

More than 3 years have passed since last update.

まずタスクとは

  • コマンドラインから実行されるかまたは cron ジョブとしてセットアップされるクラス
  • fuel/app/tasks ディレクトリに置かれています
  • 定期実行や、プロジェクトの何かをコマンドラインから行いたいときに設定すると便利

公式リファレンスはこちら

試しにrobotを起動してみよう

oil refineでタスクについてチェック

fuelのプロジェクトのディレクトリ直下に移動したらoilコマンドを実行。

$ cd fuelプロジェクト名/
$ php oil refine

Usage:
    php oil [r|refine] <taskname>

Description:
    Tasks are classes that can be run through the the command line or set up as a cron job.

Available tasks:
    php oil refine robots
    php oil refine robots:protect
    php oil refine fromdb
    php oil refine fromdb:help
    php oil refine fromdb:scaffold
    php oil refine fromdb:model
    php oil refine simple2orm
    php oil refine simple2orm:help
    php oil refine install
    php oil refine migrate:help
    php oil refine session
    php oil refine session:create
    php oil refine session:remove
    php oil refine session:clear
    php oil refine session:help

Documentation:
    http://docs.fuelphp.com/packages/oil/refine.html

このように、タスクの使い方や現在登録されているタスクを教えてくれます。

robotを起動してみよう

先ほどのAvalable tasksが、現在実行可能なタスクです。
ロボットを使って試してみましょう。

$ php oil refine robots

                    "KILL ALL HUMANS!"
                      _____     /
                     /_____\
                ____[\*---*/]____
               /\ #\ \_____/ /# /\
              /  \# \_.---._/ #/  \
             /   /|\  |   |  /|\   \
            /___/ | | |   | | | \___\
            |  |  | | |---| | |  |  |
            |__|  \_| |_#_| |_/  |__|
            //\\  <\ _//^\\_ />  //\\
            \||/  |\//// \\\\/|  \||/
                  |   |   |   |
                  |---|   |---|
                  |---|   |---|
                  |   |   |   |
                  |___|   |___|
                  /   \   /   \
                 |_____| |_____|
                 |HHHHH| |HHHHH|

「全ての人間を殺してやる」だなんて。。。
ちなみにrobots:protectを実行すると

$ php oil refine robots:protect             

                "PROTECT ALL HUMANS"
                      _____     /
                     /_____\
                ____[\*---*/]____
               /\ #\ \_____/ /# /\
              /  \# \_.---._/ #/  \
             /   /|\  |   |  /|\   \
            /___/ | | |   | | | \___\
            |  |  | | |---| | |  |  |
            |__|  \_| |_#_| |_/  |__|
            //\\  <\ _//^\\_ />  //\\
            \||/  |\//// \\\\/|  \||/
                  |   |   |   |
                  |---|   |---|
                  |---|   |---|
                  |   |   |   |
                  |___|   |___|
                  /   \   /   \
                 |_____| |_____|
                 |HHHHH| |HHHHH|

引数を与える事が可能

$ vim fuel/app/tasks/robots.php

でrobots.phpを見てみましょう。

robots.php
class Robots
{

        /**
         * This method gets ran when a valid method name is not used in the command.
         *
         * Usage (from command line):
         *
         * php oil r robots
         *
         * or
         *
         * php oil r robots "Kill all Mice"
         *
         * @return string
         */
        public static function run($speech = null)
        {
            //以下ロボットについての処理

となっています。
タスクでは実行時に引数を与える事が可能です。
以下のように実行してみましょう。

$ php oil refine robots "ご主人様の仰せの通りに"

すると、ロボットの台詞が変わります。

実際にタスクを書いてみよう

ここでは私の実例を参考に
「ある特定のデータをmysqlを叩かずに簡単にデータをinsertしたい。」
という事で、コマンドで管理できるように書いてみます。

insert.phpを書く

  • クラスをinsertクラスとしてまとめる(何かのテーブルにデータを挿入したいときのクラス)
  • テーブル名をファンクション名に指定
  • テーブルの中身はid(auto_increment)、title、created_at、updated_at
$ vim fuel/app/tasks/insert.php
insert.php
<?php

//ドキュメントルートの指定で書かないといけないやつ
namespace Fuel\Tasks;

    /*DBに特定の情報を登録するためのスクリプト
     *今回の場合はカテゴリというテーブルに、新しいデータを挿入するスクリプト。 
    */
  class Insert {
    public static function categories($title)
    {
      $query = \DB::insert('categories')->set(array(
        'title' => $title));
      $query->execute();
    }
  }

この内容で保存します。

実際に確認と実行

まずはきちんとタスクが登録されているかの確認

$ php oil refine

Usage:
    php oil [r|refine] <taskname>

Description:
    Tasks are classes that can be run through the the command line or set up as a cron job.

Available tasks:
    php oil refine insert:categories //ここに追加されていればOK!!
    php oil refine robots
    php oil refine robots:protect
    php oil refine fromdb
    php oil refine fromdb:help
    php oil refine fromdb:scaffold
    php oil refine fromdb:model
    php oil refine simple2orm
    php oil refine simple2orm:help
    php oil refine install
    php oil refine migrate:help
    php oil refine session
    php oil refine session:create
    php oil refine session:remove
    php oil refine session:clear
    php oil refine session:help

Documentation:
    http://docs.fuelphp.com/packages/oil/refine.html

Available taskに追加されている事が分かります。

実行してみる

このタスクは引数としてカテゴリのタイトルを受け取るように書いているので、

$ php oil refine insert:categories "ファッション"

というという形で実行します。
問題なければこれで簡単にDBに新しいデータをinsertする事が可能です。

まとめ

  1. php oil refine クラス:ファンクション でタスクを実行可能
  2. タスクには引数を与える事が可能
  3. タスクファイルは fuel/app/tasks で管理される
  4. このロボットはなぜか人類を滅ぼそうとしている

データ変更の作業以外にも、定期実行のスクリプト等、幅広く応用できるtasksをこれからももっと応用していきたい。