有料会員制のwebサイトを開発した時に、有料会員のフラグを月次で切り替えるバッチ処理を作成しました。ある特定のフラグが立っているユーザに対して、一括でアップデート処理をするというものです。
今回は、バッチ処理を作成する過程で、CakePHPでシェルを作成してコンソールから実行するところをまでを紹介したいと思います(CakePHP3 v.3.4.4)。
シェルの作成
とりあえず試しに、シンプルなシェルを作成します。
src/Shellディレクトリーに「HelloShell.php」を作成します。
内容は以下のようにします。
【HelloShell.php】
<?php
namespace App\Shell;
use Cake\Console\Shell;
class HelloShell extends Shell
{
public function main()
{
$this->out('Hello world.');
}
}
ファイル名とクラス名は一致し、Shellサフィックスをつける必要があります。
ファイル名:「(任意のシェル名)Shell.php」
クラス名:「(上と同じ名前)Shell」
シェルを実行すると「main()」が呼ばれますので、この関数の中に処理を書きます。
シェルの実行
アプリケーションディレクトリに移動します。
(bin/cake コマンドが使えるところ)
以下のコマンドを入力します。
「bin/cake (作成時に設定したシェル名)」
ここでは「bin/cake Hello」
※「Shell」はつけない。
※「Hello」でも「hello」でも動きます。
bin/cake Hello
Welcome to CakePHP v3.4.4 Console
---------------------------------------------------------------
App : src
Path: /Applications/MAMP/htdocs/sample/my_app_name/src/
PHP : 7.0.15
---------------------------------------------------------------
Hello world.
モデルを使ったシェルの作成
先ほど作ったのは、モデルを使用しない処理でした。
今回実装したかったことはシェルでデータベースのフラグを切り替える処理です。
次はモデルを使用したシェルを作成してみます。
コントローラー同様にモデルを使用し、更新処理をかけることができます。
<?php
namespace App\Shell;
use Cake\Console\Shell;
class ChangeFlgShell extends Shell
{
public function main()
{
$this->loadModel('Users');
$condition = ['cancel_flg' => '1'];
$updatefield = [
'paying_flg' => '0',
'cancel_flg' => '0'
];
$this->Users->updateAll($updatefield,$condition);
}
}
Usersテーブルのデータに対して以下の更新をかけます。
「cancel_flg」が「1」のユーザに対して、
「paying_flg」を「0」、「cancel_flg」を「0」にする。
データベースの準備
今回更新をかける「Users」テーブルに新規のユーザを登録しておきます。
「cancel_flg」を「1」
「paying_flg」を「1」
で登録します。
mysql> select id,username,cancel_flg,paying_flg from users where id = '1' \G;
*************************** 1. row ***************************
id: 1
username: testuser
cancel_flg: 1
paying_flg: 1
1 row in set (0.00 sec)
モデルを使用したシェルの実行
先ほど作成したシェルを実行してみます。
bin/cake changeflg
Welcome to CakePHP v3.4.4 Console
---------------------------------------------------------------
App : src
Path: /Applications/MAMP/htdocs/sample/my_app_name/src/
PHP : 7.0.15
---------------------------------------------------------------
データベースの方を確認してみましょう。
mysql> select id,username,cancel_flg,paying_flg from users where id = '1' \G;
*************************** 1. row ***************************
id: 1
username: testuser
cancel_flg: 0
paying_flg: 0
1 row in set (0.00 sec)
「cancel_flg」「paying_flg」共に更新されていますね。
まとめ
モデルを使用したシェルも通常通り動く。
ファイル名とクラス名は以下のようにする。
ファイル名:「(任意のシェル名)Shell.php」
クラス名:「(上と同じ名前)Shell」
コンソールからシェルを実行するときは「bin/cake (シェル名)」
シェル実行コマンドをcronとかで設定しておけばバッチ処理として動かすことができます。
cronの設定方法に関しては、また機会がある時に記事にいたします。
飲食業界からIT業界に転身してきて現在2年目です。PHPの経験がメインとなります。これまで自分がPHPを扱ってきた上で、モヤモヤしてきたことをメインに記事にしていきますのでよろしくお願いいたします。