Laravel Schedulerやタスクスケジューラーが動作しない原因と、確実に動作させるための設定方法を実案件での経験を元に詳しく解説します。
Laravelの定期実行が動かなくて困っていませんか?
「データの集計処理を毎日自動化したい」「メルマガの送信を定期的に行いたい」「レポート生成を夜間に実行したい」
このような要望でLaravelのScheduler機能を実装したものの、なぜか動作しない...というお悩みをよく耳にします。
実際に弊社でも、ECサイトの在庫更新処理が動作していなかったため、顧客への商品案内に支障が出てしまったケースがありました。今回は、そうした実案件での経験を基に、Laravel定期実行の確実な設定方法をご紹介します。
なぜLaravelの定期実行は動かないのか?
主な原因5つ
- cronの設定不備
- PHPのパスが間違っている
- プロジェクトパスの指定ミス
- 権限の問題
- ログの出力設定不備
ある製造業のクライアント様では、月次の売上集計が止まっていたことに気づかず、3ヶ月後に発覚するという事態がありました。その原因は、サーバー移行時にcronの設定を見落としていたことでした。
確実に動作させる設定手順
1. Laravelスケジューラーの作成
まず、実行したい処理をCommandクラスで作成します。
<?php
// app/Console/Commands/DailyReport.php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
class DailyReport extends Command
{
protected $signature = 'report:daily';
protected $description = 'Generate daily report';
public function handle()
{
Log::info('Daily report started');
// レポート生成処理
$this->info('Daily report completed');
Log::info('Daily report completed');
}
}
2. スケジューラーへの登録
<?php
// app/Console/Kernel.php
protected function schedule(Schedule $schedule)
{
$schedule->command('report:daily')
->dailyAt('02:00')
->emailOutputOnFailure('[email protected]');
}
3. cronの正しい設定
ここが最も重要なポイントです。多くの場合、cron設定の不備が原因で動作しません。
# crontabの編集
crontab -e
# 正しい設定例
* * * * * /usr/bin/php /var/www/html/your-project/artisan schedule:run >> /var/log/cron.log 2>&1
重要なポイント:
- PHPの正確なパス(
which phpで確認) - プロジェクトの正確なパス
- ログ出力の設定
4. 権限の確認と設定
# プロジェクトの所有者確認
ls -la /var/www/html/your-project/
# 必要に応じて権限変更
sudo chown -R www-data:www-data /var/www/html/your-project/
sudo chmod -R 755 /var/www/html/your-project/storage/
sudo chmod -R 755 /var/www/html/your-project/bootstrap/cache/
失敗しないための確認方法
動作確認の手順
- 手動実行でのテスト
php artisan report:daily
- スケジューラーの確認
php artisan schedule:list
- cron設定の確認
crontab -l
ログによる監視
実案件では、処理が失敗していることに気づかないケースが多いため、必ずログ出力を設定しましょう。
// config/logging.php
'channels' => [
'scheduler' => [
'driver' => 'single',
'path' => storage_path('logs/scheduler.log'),
'level' => 'info',
],
],
// Commandクラス内
use Illuminate\Support\Facades\Log;
public function handle()
{
Log::channel('scheduler')->info('Task started: ' . $this->signature);
try {
// 処理内容
Log::channel('scheduler')->info('Task completed successfully');
} catch (\Exception $e) {
Log::channel('scheduler')->error('Task failed: ' . $e->getMessage());
throw $e;
}
}
よくある失敗パターンと対策
パターン1:環境変数が読み込まれない
問題: cronから実行すると.envファイルが読み込まれない
対策: 設定ファイルのキャッシュを作成
php artisan config:cache
パターン2:時間設定のミス
問題: サーバーのタイムゾーンとアプリケーションのタイムゾーンが異なる
対策: タイムゾーンの確認と統一
// config/app.php
'timezone' => 'Asia/Tokyo',
// Kernel.phpでも明示的に設定
protected function schedule(Schedule $schedule)
{
$schedule->command('report:daily')
->dailyAt('02:00')
->timezone('Asia/Tokyo');
}
導入後の効果と変化
実際にクライアント様で定期実行を正しく設定した結果:
- ECサイト:在庫更新の自動化により、売り越しが90%減少
- 製造業:日次レポートの自動生成で、管理者の作業時間が月20時間削減
- サービス業:会員向けメルマガの配信自動化で、配信忘れがゼロに
まとめ:確実に動作させるためのチェックリスト
定期実行を確実に動作させるため、以下の項目を必ず確認してください:
- Commandクラスが正しく作成されている
- Kernel.phpに適切に登録されている
- cronの設定が正確(パス、権限、出力先)
- ファイルの権限が適切
- ログ出力が設定されている
- 手動実行でのテストが完了
- 監視・アラート機能が設定されている
「定期実行の設定で困っている」「既存のシステムが動作しているか不安」という場合は、ぜひ一度ご相談ください。横浜を拠点に20年以上の実績を持つ弊社が、安心して運用できる環境構築をサポートいたします。