CodeIgniter 4でバッチ処理を完全マスター!Sparkコマンドとcron連携の基本
生徒
「毎日決まった時間に、自動でデータベースを掃除したりメールを送ったりする方法はありますか?」
先生
「CodeIgniter 4には『Spark』という便利な道具があって、それを使うと『バッチ処理』という自動プログラムが作れますよ。」
生徒
「パソコンの画面を開いていなくても勝手に動いてくれるんですか?」
先生
「その通りです!『cron(クローン)』という仕組みと連携すれば、真夜中でも自動で実行されます。仕組みを順番に解説しますね!」
1. バッチ処理とSparkコマンドの基本を学ぼう
プログラミングの世界には、人間が画面を操作して動かす「Webアプリケーション」のほかに、裏側で自動的に動く「バッチ処理」という仕組みがあります。バッチとは、日本語で「束(たば)」や「一括」という意味があり、大量のデータをまとめて処理することを指します。
例えば、ネットショップの在庫を毎日深夜0時に更新したり、1週間ログインしていないユーザーに通知を送ったりする作業は、人間が手動で行うのは大変です。これをプログラムに任せるのがバッチ処理の役割です。
CodeIgniter 4 (コードイグナイター4)では、このバッチ処理を作るために「Spark(スパーク)」というコマンドラインツールを使います。コマンドラインとは、マウスを使わずにキーボードで文字を打ち込んでパソコンに命令を出す画面のことです。Windowsなら「コマンドプロンプト」や「PowerShell」、Macなら「ターミナル」というアプリを使います。
2. CLI(コマンドラインインターフェース)とは?
初心者の方にとって「CLI」という言葉は難しく感じるかもしれません。CLIとはCommand Line Interface(コマンドライン・インターフェース)の略です。普段私たちがスマホやパソコンでアイコンをクリックして操作する方法をGUI(グラフィカル・ユーザー・インターフェース)と呼びますが、CLIはその文字版だと考えてください。
CodeIgniterでバッチ処理を作る際、このCLI専用のプログラムを作成します。Webブラウザ(Google ChromeやSafariなど)でURLにアクセスして動かすのではなく、サーバーの中で直接プログラムを呼び出すため、非常に高速で効率的に動作します。また、ブラウザ経由ではないので、途中でネット接続が切れて処理が止まるといった心配も少なくなります。
3. 最初のバッチプログラム(Command)を作成してみよう
それでは、実際にCodeIgniter 4でバッチ処理の雛形(ひながた)を作ってみましょう。CodeIgniterには、自動でプログラムの土台を作ってくれる魔法のコマンドがあります。プロジェクトのフォルダに移動して、以下のコマンドを打ち込んでみてください。
php spark make:command HelloBatch
このコマンドを実行すると、app/Commands/ というフォルダの中に HelloBatch.php という名前のファイルが自動的に出来上がります。このファイルの中に、自動で行わせたい処理を書いていきます。まずは、画面に文字を表示するだけのシンプルなプログラムを見てみましょう。
<?php
namespace App\Commands;
use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;
class HelloBatch extends BaseCommand
{
// コマンドを呼び出す時の名前
protected $group = 'Custom';
protected $name = 'batch:hello';
protected $description = '挨拶を表示するだけの簡単なバッチ処理です。';
public function run(array $params)
{
// 画面にメッセージを表示
CLI::write('こんにちは!バッチ処理が正常に実行されました。', 'green');
CLI::write('実行日時: ' . date('Y-m-d H:i:s'));
}
}
このプログラムでは、CLI::write という命令を使って、コマンド画面に文字を表示させています。'green' と指定すると、文字が緑色で表示されるので、成功したことが分かりやすくなります。これは基本中の基本ですが、全てのバッチ処理の第一歩です。
4. データベースを操作する実践的なバッチ処理
次に、もう少し実用的な例を紹介します。例えば、ログデータ(操作記録)が増えすぎてサーバーの容量を圧迫しないように、古いデータを削除するバッチ処理を考えてみましょう。プログラムの中でデータベースに接続して、特定の条件に合うデータを消す処理を書きます。
このように「決まったルールに従ってデータを整理する」のは、バッチ処理が得意とする分野です。データベースを操作する場合でも、通常のWebサイト制作と同じようにモデル(Model)を使うことができるので、今までの知識をそのまま活かせます。
<?php
namespace App\Commands;
use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;
use App\Models\LogModel;
class CleanLog extends BaseCommand
{
protected $group = 'Database';
protected $name = 'db:clean-log';
protected $description = '30日以上前の古いログデータを削除します。';
public function run(array $params)
{
$model = new LogModel();
// 30日前の日付を計算
$dateLimit = date('Y-m-d H:i:s', strtotime('-30 days'));
// データベースから古いデータを削除
$deletedRows = $model->where('created_at <', $dateLimit)->delete();
if ($deletedRows) {
CLI::write($deletedRows . '件の古いログを削除しました。', 'yellow');
} else {
CLI::write('削除対象のデータはありませんでした。', 'white');
}
}
}
このコードでは、30日前の時刻を計算し、それより古いデータを一括で削除しています。手動でやると大変な作業も、このコマンド一つで一瞬で終わります。
5. 作成したコマンドを自分で動かしてみる
プログラムが書けたら、実際に動かしてみましょう。作成したコマンドを実行するには、コマンドラインで以下のように入力します。php spark の後に、プログラム内の $name で決めた名前を続けます。
php spark db:clean-log
正しく動くと、画面に「〇〇件の古いログを削除しました。」と表示されます。このように、まずは自分でコマンドを叩いてみて、プログラムが意図した通りに動くか確認する作業を「動作確認(テスト)」と呼びます。バッチ処理は自動で動くものなので、予期せぬ動きをして大事なデータを消さないよう、慎重にテストすることが大切です。
6. cron(クローン)の設定で定期実行を実現する
さて、いよいよ本題の「定期実行(自動化)」です。サーバーには「cron(クローン)」という、スケジュール管理をしてくれる執事のような機能があります。これに「毎日深夜2時にこのコマンドを実行して」と予約しておくことで、人間が寝ている間にバッチ処理を終わらせることができます。
cronの設定は、サーバーの設定ファイル(crontab)に記述します。一般的な書き方は以下のようになります。初心者のうちは難しく見えるかもしれませんが、5つの数字が「分・時・日・月・曜日」を表していると覚えれば大丈夫です。
# 毎日、深夜2時0分にCodeIgniterのバッチを実行する設定例
0 2 * * * cd /path/to/your-project && /usr/bin/php spark db:clean-log > /dev/null 2>&1
この設定の意味を噛み砕くと次のようになります。
0 2 * * *: 毎日の2時0分に実行するという意味。cd /path/to/your-project: プログラムがあるフォルダへ移動する。&&: 移動が成功したら次の命令へ進む。/usr/bin/php spark ...: PHPを起動してSparkコマンドを動かす。> /dev/null 2>&1: 実行結果を画面に出さず、静かに処理を終えるためのおまじない。
7. バッチ処理を作る時の注意点とコツ
自動で動くバッチ処理はとても便利ですが、いくつか気をつけるポイントがあります。まず一つ目は「無限ループ」です。プログラムがいつまでも終わらずに動き続けてしまうと、サーバーのメモリがいっぱいになり、他のサービスまで止まってしまうことがあります。
二つ目は「エラーの記録」です。自動で動いているため、失敗したときに誰も気づけません。そのため、エラーが起きたときは「ログファイル」という日記のようなものに内容を書き出すようにしておくと、後から「なぜ失敗したのか」を調べることができます。
三つ目は「二重実行」の防止です。例えば、1分ごとに動くバッチを作ったとして、1回目の処理が1分以上かかってしまった場合、2回目の処理が始まってしまい、同じデータを二回処理してしまうことがあります。これを防ぐために、処理中は「今実行中ですよ」という旗(ロックファイル)を立てるなどの工夫をすることもあります。
8. 外部APIとの連携バッチの例
最後に、応用編として外部のサービス(API)から情報を取得してくるバッチ処理のイメージを紹介します。例えば、天気予報の情報を取得してデータベースに保存する、といった処理です。CodeIgniterには CURLRequest という便利な機能があり、他のウェブサイトからデータを取ってくるのも簡単です。
<?php
namespace App\Commands;
use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;
class FetchWeather extends BaseCommand
{
protected $group = 'External';
protected $name = 'api:get-weather';
protected $description = '天気情報を取得して保存します。';
public function run(array $params)
{
$client = \Config\Services::curlrequest();
CLI::write('天気情報を取得中...');
// 外部のAPIにアクセス(例:お天気データ)
$response = $client->get('https://api.example.com/weather');
if ($response->getStatusCode() === 200) {
$data = $response->getBody();
// ここでデータベースに保存する処理などを書く
CLI::write('データの取得に成功しました!', 'cyan');
} else {
CLI::error('データの取得に失敗しました。');
}
}
}
このように、バッチ処理を使えば「自分のサイト」と「外の世界」をつなぐ自動プログラムも自由自在に作れます。まずは小さな挨拶コマンドから始めて、徐々に便利な自動化ツールを作っていきましょう!