CodeIgniter 4でCLIバッチ処理を完全攻略!Sparkコマンドの自作方法
生徒
「CodeIgniterで、画面を使わずに裏側で動かすプログラムを作りたいのですが、どうすればいいですか?」
先生
「それは『CLIバッチ処理』というものですね。CodeIgniter 4には『Spark(スパーク)』という便利な仕組みがありますよ。」
生徒
「CLI?バッチ?難しい言葉ばかりで難しそうですね...初心者でも作れますか?」
先生
「大丈夫です!一度仕組みを覚えてしまえば、決まった時間にメールを送ったり、データを整理したりする自動化プログラムが簡単に作れます。一緒に学んでいきましょう!」
1. CLIとバッチ処理ってなに?初心者にもわかりやすく解説
プログラミングを始めたばかりの方にとって、CLIやバッチ処理という言葉は聞き慣れないものですよね。まずはこの正体を知ることから始めましょう。
普段、私たちがインターネットを見るときは、Google Chromeなどのブラウザを使ってボタンをクリックしたり、文字を入力したりします。これを「GUI(グラフィカル・ユーザー・インターフェース)」と呼びます。目で見て直感的に操作できる方法です。
一方で、CLI(コマンド・ライン・インターフェース)とは、真っ黒な画面(WindowsならコマンドプロンプトやPowerShell、Macならターミナル)に文字を打ち込んでパソコンに命令を出す方法のことです。マウスは一切使いません。
そして、バッチ処理とは、「あらかじめ決めておいた一連の処理を、自動でまとめて実行すること」を指します。例えば、「毎日深夜3時に、古いログファイルを削除する」「1時間おきに、最新の在庫情報をデータベースに登録する」といった、人間がわざわざボタンを押さなくてもいい仕事をプログラムに任せるのがバッチ処理の役割です。
2. CodeIgniterの強力なツール「Spark」を知ろう
PHPのフレームワークであるCodeIgniter 4には、Spark(スパーク)という専用の道具箱が入っています。これは、私たちが作ったプログラムをCLIで動かすための司令塔のような存在です。
料理に例えると、CodeIgniterというキッチンの中に、Sparkという「自動調理ボタン付きの電子レンジ」があるようなイメージです。私たちが「このレシピで調理して!」とSparkに命令すると、画面を開くことなく料理(プログラムの実行)を完成させてくれます。
通常、WebサイトのプログラムはブラウザからURL(http://...)にアクセスして動かしますが、バッチ処理ではこのSparkを使って、パソコンの内部から直接プログラムを呼び出します。これにより、外部からのアクセスを制限しつつ、重たい処理を裏側で実行させることが可能になります。
3. 最初のバッチプログラム!Hello Worldを表示してみよう
それでは、実際に動くプログラムを作ってみましょう。まずは、画面に文字を表示するだけのシンプルな「挨拶バッチ」を作成します。
CodeIgniterでは、app/Commandsというフォルダの中に、自分専用のコマンドファイルを作成します。今回は「Hello」という名前のファイルを作ってみましょう。
namespace App\Commands;
use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;
class Hello extends BaseCommand
{
// コマンドを呼び出すときの名前を設定します
protected $group = 'Custom';
protected $name = 'say:hello';
protected $description = '画面に挨拶を表示するだけの簡単なバッチです。';
public function run(array $params)
{
// CLI::writeを使うと、黒い画面に文字が出力されます
CLI::write('こんにちは!CodeIgniterのバッチ処理が成功しました!', 'green');
}
}
このコードを書いたファイルを保存したら、コマンドプロンプトやターミナルを開いて、CodeIgniterがインストールされているフォルダで以下の魔法の言葉を入力してください。
php spark say:hello
実行結果は以下のようになります。
こんにちは!CodeIgniterのバッチ処理が成功しました!
4. データを計算して保存する!実用的なバッチ処理の例
挨拶ができるようになったら、次は少しプログラミングらしいことをしてみましょう。例えば、複数の数字を合計して、その結果を表示するバッチです。
バッチ処理のいいところは、大量のデータ計算などを、ユーザーの待ち時間を気にせずに実行できる点です。ここでは引数(プログラムに渡す値)を使って計算をしてみます。
namespace App\Commands;
use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;
class Calculator extends BaseCommand
{
protected $group = 'Math';
protected $name = 'math:add';
protected $description = '2つの数字を足し算します。';
public function run(array $params)
{
// 実行時に渡された数字を受け取ります
$firstNumber = $params[0] ?? 0;
$secondNumber = $params[1] ?? 0;
$result = $firstNumber + $secondNumber;
CLI::write("計算結果は: " . $result . " です!", 'yellow');
}
}
このプログラムを実行するときは、名前の後に数字をスペースで区切って入力します。
php spark math:add 10 25
実行結果はこうなります。
計算結果は: 35 です!
5. データベースを操作するバッチ処理に挑戦
実際の開発で最もよく使われるのが、データベース(情報を貯めておく倉庫)を操作するバッチです。例えば、有効期限が切れた会員情報を「退会済み」に変更するような処理です。
データベースを扱うときは、PHPのModel(モデル)という仕組みを使います。モデルは、データベースとのやり取りを担当する専門の係員だと考えてください。
namespace App\Commands;
use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;
// モデルを使うための宣言
use App\Models\UserModel;
class UserCleanup extends BaseCommand
{
protected $group = 'User';
protected $name = 'user:cleanup';
protected $description = '1年以上ログインしていないユーザーをチェックします。';
public function run(array $params)
{
$userModel = new UserModel();
// 実際にはここでデータベースからデータを取得します
// 今回はシミュレーションとして、件数を表示してみましょう
$count = $userModel->countAll();
CLI::write("現在、登録されているユーザー数は " . $count . " 名です。", 'cyan');
CLI::write("クリーニング処理を開始します...", 'white');
// 処理が終わったことを知らせる
CLI::write("完了しました!", 'green');
}
}
6. 条件分岐(if文)を使ったバッチ処理の制御
バッチ処理の中で、「もし~だったら、この処理をする」という判断が必要になることがあります。これを条件分岐と呼び、ifというキーワードを使います。
例えば、バッチを実行する際に「テストモード」かどうかを判定して、本番のデータを書き換えないようにガードをかけることができます。
namespace App\Commands;
use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;
class SafeTask extends BaseCommand
{
protected $group = 'Admin';
protected $name = 'task:run';
public function run(array $params)
{
// 最初の引数が 'force' かどうかをチェック
$mode = $params[0] ?? 'test';
if ($mode === 'force') {
CLI::write('【警告】本番モードで実行します。データを更新します。', 'red');
// ここに大切な更新処理を書く
} else {
CLI::write('テストモードで実行中。実際には何も変更しません。', 'blue');
}
}
}
このように書くことで、誤って大切なデータを消してしまうミスを防ぐことができます。if文はバッチ処理の安全性を高めるために欠かせない技術です。
7. バッチ処理でエラーが起きたら?ログの重要性
バッチ処理は、夜中など人間が見ていない間に動くことが多いです。もし処理の途中でエラーが発生しても、誰も気づくことができません。そこで重要になるのがログ(記録)です。
CodeIgniterには、エラーの内容をファイルに書き出す機能が備わっています。日記のように、「いつ、どんなことが起きたか」を記録しておくことで、朝起きたときに確認できるのです。
プログラミング未経験の方は、「エラーは怖いもの」と思いがちですが、実は「どこが間違っているか教えてくれるヒント」です。CLIバッチでは、画面にエラーを表示するだけでなく、必ずログファイルに残す設定を意識しましょう。
8. 便利な応用:引数とオプションを使いこなす
Sparkコマンドには、実行時にいろいろな「オプション」を付けることができます。例えば、処理を途中で止めるかどうかを選択したり、特定のIDのデータだけを狙って処理したりすることが可能です。
オプションは --name=value のような形で指定します。これを使えるようになると、一つのプログラムで何通りもの動きをさせることができ、とても効率的です。
初心者の方は、まずは基本の run() 関数の中で CLI::write() を使って文字を出す練習から始めましょう。慣れてきたら、モデルを呼び出してデータベースの情報を整理するバッチを作ってみてください。自分の書いた文字が、真っ黒な画面上で動く快感は、プログラマーだけの特権ですよ!