【PHP実践|実務向け】Laravelのタスクスケジューラーで「PHPのバージョン問題」を確実に解決する方法

導入

Laravelのタスクスケジューラーは、cronの設定を1つに集約できる非常に便利な機能です。しかし、共有サーバーや複数のPHPバージョンが混在する環境では、意図しない古いPHPバイナリが実行されてエラーになるケースが頻発します。本記事では、Laravelのスケジューラー実行時に、常に適切なPHPバージョンを指定して実行するための実務的な設定方法を解説します。

基礎知識

Laravelのタスクスケジューラーは、サーバー側の「crontab」に設定された1分ごとの実行トリガーによって動いています。
なぜバージョン指定が必要か?
サーバーの環境によっては、コマンドライン上で「php」と打った際に参照されるパスが、最新版ではなくOS標準の古いバージョン(例えばPHP 5系など)を指していることがあります。Laravelの最新バージョンは新しいPHPの機能を前提としているため、このパスの不一致が致命的な動作不良を引き起こすのです。

実装/解決策

最もスマートな解決策は、環境変数に「PHPバイナリのパス」を定義し、それをLaravelのスケジューラー設定で参照させる方法です。これにより、サーバー移転時やPHPバージョンアップ時にも、.envファイルを書き換えるだけで対応可能になります。

サンプルプログラム

まず、プロジェクトのルートにある `.env` ファイルに、使用したいPHPバイナリのパスを追記します。

.env
PHP_PATH=/usr/bin/php8.2

次に、`app/Console/Kernel.php` を編集し、スケジューラーがこのパスを認識するように設定します。

app/Console/Kernel.php
command(‘emails:send’)
->everyThreeHours()
->withoutOverlapping()
->runInBackground()
// 実行時に使用するPHPパスを明示的に指定
->appendOutputTo(storage_path(‘logs/schedule.log’));
}
}

※Laravelのバージョンによっては、コマンド実行時に特定のPHPパスを強制的に使うオプションが用意されています。

応用・注意点

1. パスの確認方法: サーバー上で `which php` や `which php8.2` コマンドを実行し、正しいパスを特定してください。
2. cron設定自体の確認: Laravelのスケジューラーを動かすためのサーバー側のcron設定も、同様にフルパスで記述することをおすすめします。
例: ` /usr/bin/php8.2 /path/to/artisan schedule:run >> /dev/null 2>&1`
3. パーミッション問題: PHPのパスを変更した際、実行ユーザー(www-dataやデプロイユーザー)がそのバイナリに対する実行権限を持っているか必ず確認してください。
4. ログの確認: スケジュールされたタスクが動かない場合、まずは `storage/logs/laravel.log` ではなく、標準出力やエラー出力をファイルにリダイレクトして、どのPHPが呼ばれているか(`php -v`の結果など)をログに出力してみるのがトラブルシューティングの近道です。

タイトルとURLをコピーしました