CodeIgniter 4でカスタムSparkコマンドを作成!CLIとバッチ処理を完全解説
生徒
「CodeIgniterで、ブラウザを使わずに裏側でプログラムを動かす『バッチ処理』を作りたいのですが、どうすればいいですか?」
先生
「CodeIgniter 4には『Spark』という便利な道具があります。これを使うと、自分専用のコマンドを作って、黒い画面(コマンドライン)からプログラムを動かせるようになりますよ。」
生徒
「自分専用のコマンドが作れるんですね!難しそうですが、初心者でもできますか?」
先生
「大丈夫です。手順を一つずつ確認しながら、まずは簡単な挨拶を表示するコマンドから作ってみましょう!」
1. PHPのCLIとSparkコマンドの基本を学ぼう
パソコンを使ってWebサイトを見る時は、普段「ブラウザ(Google ChromeやEdgeなど)」を使いますよね。しかし、プログラミングの世界では、マウスを使わずにキーボードだけで命令を打ち込むCLI(コマンドラインインターフェース)という操作方法がよく使われます。初心者の方には「黒い画面」と言えば伝わりやすいかもしれません。
CodeIgniter 4(コードイグナイター4)というPHPのフレームワークには、このCLI操作を助けてくれるSpark(スパーク)という仕組みが備わっています。これを使うと、例えば「毎日夜中の12時にデータを整理する」といった、人間が操作しなくても自動で動くバッチ処理を簡単に作ることができるのです。バッチ処理とは、一定の処理をまとめて自動的に実行することを指します。これから、自分だけの「カスタムSparkコマンド」を作る方法を解説していきます。
2. カスタムコマンドを作るための準備:雛形の作成
まずは、コマンドの土台となるファイルを作成します。CodeIgniterには、コマンドのファイルを自動で生成してくれる機能があります。パソコンのターミナル(WindowsならコマンドプロンプトやPowerShell)を開いて、プロジェクトのフォルダで以下の命令を入力してみましょう。
php spark make:command HelloCommand
この命令を実行すると、app/Commandsというフォルダの中に、HelloCommand.phpというファイルが自動で作られます。make:commandは「新しいコマンドのファイルを作ってね」という命令です。これで、自分専用のコマンドを作る準備が整いました。プログラミングにおいて、一から全てを書くのではなく、こうした自動生成機能を使うのは効率化の基本です。
3. コマンドの中身を書き換えて「挨拶」を表示させよう
作成されたファイルを開くと、いくつかの設定項目があります。まずは、画面に「こんにちは!」と表示されるだけのシンプルなプログラムを書いてみましょう。以下のコードを参考に、ファイルを編集してみてください。
namespace App\Commands;
use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;
class HelloCommand extends BaseCommand
{
// コマンドを呼び出す時の名前
protected $group = 'Custom';
protected $name = 'say:hello';
protected $description = '画面に挨拶を表示するだけの簡単なコマンドです。';
public function run(array $params)
{
// 画面に文字を表示する
CLI::write('こんにちは!CodeIgniterのカスタムコマンドへようこそ。', 'green');
}
}
ここで重要なのは $name です。ここに書いた say:hello が、実際にコマンドを動かす時のキーワードになります。また、CLI::write という命令を使うことで、画面に文字を出力できます。第2引数に 'green' と指定すると、文字が緑色で表示されるので、成功したことが分かりやすくなりますね。
4. 作成したカスタムコマンドを実行してみる
それでは、先ほど作ったコマンドを実際に動かしてみましょう。再びターミナルに戻り、以下の命令を入力してエンターキーを押してください。
php spark say:hello
実行結果として、画面に以下のようなメッセージが表示されれば成功です!
こんにちは!CodeIgniterのカスタムコマンドへようこそ。
このように、自分で決めた say:hello という名前でプログラムを呼び出せることが確認できました。これがカスタムコマンドの第一歩です。ブラウザをリロードしなくても、キーボードの入力だけでプログラムが動くのは、開発者らしくてかっこいいですよね。引数(ひきすう)という仕組みを使えば、もっと複雑なこともできるようになります。
5. 実用的な例:名前を受け取ってメッセージを変える
次は、コマンドに「名前」を教えてあげると、その名前に合わせて挨拶をしてくれるプログラムを作ってみましょう。これをプログラミング用語で「引数(引数)を受け取る」と言います。HelloCommand.phpの run メソッドの中身を以下のように書き換えてみてください。
public function run(array $params)
{
// 最初の引数(名前)を取得する。なければ「ゲスト」にする
$name = $params[0] ?? 'ゲスト';
CLI::write($name . "さん、今日もプログラミングを頑張りましょう!", 'cyan');
}
書き換えたら、今度は名前を付けて実行してみましょう。例えば「田中」さんと呼びかけたい場合は、次のように入力します。
php spark say:hello 田中
実行結果:
田中さん、今日もプログラミングを頑張りましょう!
このように、コマンドの後ろにスペースを空けて文字を入力することで、プログラムの中にその情報を渡すことができます。これができると、「特定のユーザーだけにメールを送るバッチ処理」など、活用の幅が一気に広がります。
6. データベースと連携したバッチ処理の作成
バッチ処理の本当の力は、データベース(情報の保管庫)と組み合わせた時に発揮されます。例えば、「使われていない一時的なデータを削除する」といった掃除のプログラムです。ここでは、擬似的に「ログを削除しました」と表示するログクリーンアップコマンドの例を見てみましょう。新しいコマンド php spark make:command LogClear を作成したと仮定します。
namespace App\Commands;
use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;
class LogClear extends BaseCommand
{
protected $group = 'Database';
protected $name = 'db:clean-logs';
protected $description = '古いログデータを削除してデータベースを綺麗にします。';
public function run(array $params)
{
CLI::write('古いデータのスキャンを開始します...', 'yellow');
// 本来はここでデータベースの削除処理などを行う
// $model = new LogModel();
// $model->where('created_at <', date('Y-m-d', strtotime('-30 days')))->delete();
CLI::write('30日以上前のログを正常に削除しました!', 'green');
}
}
このコマンドを php spark db:clean-logs と実行することで、データベースのメンテナンスが行えるようになります。Webサイトの裏側では、こうした目に見えないプログラムが毎日コツコツと働いて、サイトの健康を保っているのです。
7. 複雑な条件分岐を使ったバッチ処理の応用
最後に、少し応用編として、実行する時のオプションによって処理を変える方法を紹介します。例えば、「テスト実行(実際には消さない)」か「本番実行(本当に消す)」かを切り替えるようなイメージです。以下のコードは、入力された値によって動作を分岐させる例です。
public function run(array $params)
{
$mode = $params[0] ?? 'test';
if ($mode === 'real') {
CLI::error('!!! 本番モードで実行中。データを実際に更新します !!!');
// 本番の重い処理をここに書く
} else {
CLI::write('テストモードです。画面表示のみ行います。', 'white', 'blue');
// 確認用の表示だけをここに書く
}
}
CLI::error を使うと、背景が赤色の目立つ警告メッセージを出すことができます。バッチ処理は、間違えて実行すると取り返しのつかないことになる場合もあるため、このように「本当に実行していいのか」を確認する仕組みを入れることが、プロのプログラマーへの第一歩です。これで、CodeIgniterのSparkコマンドを使ったバッチ処理の作り方の基本はバッチリです!