🔍 Blog Cron Jobs - Sorun Analizi

📅 Tarih: 2025-11-19 05:45 | 🎯 Tenant: ixtif.com (Tenant #2) | 👤 Talep: Blog AI cron sisteminin çalışmaması sorunu

⚠️ KRİTİK SORUN TESPİT EDİLDİ!

Ana Sorun: Laravel Scheduler'da generate:tenant-blogs komutu tanımlı AMA php artisan schedule:list çıktısında GÖRÜNMÜYOR!

Sonuç: Cron her dakika çalışıyor, ama blog generation komutu schedule listesinde yok, dolayısıyla ASLA çalışmıyor!

🔎 Analiz Özeti

1. Sistem Durumu Kontrolleri

✅ ÇALIŞIYOR Crontab: Laravel scheduler her dakika çalışıyor
✅ ÇALIŞIYOR Horizon: Queue worker aktif ve çalışıyor
✅ ÇALIŞIYOR Blog AI Queue: blog-ai queue'su Horizon'da tanımlı
✅ HAZIR Draft Pool: 352 adet draft mevcut ve kullanıma hazır
✅ AKTIF Tenant Settings: blog_ai_enabled = 1, daily_count = 8
❌ ÇALIŞMIYOR Schedule Registration: generate:tenant-blogs komutu schedule listesinde YOK!

2. Schedule List Karşılaştırması

Laravel Scheduler'da kayıtlı komutlar:

Komut Zamanlama Durum
payment:update-paytr-rates Daily (09:00, 18:00) Çalışıyor
tenants:run currency:update-rates Daily (10:00, 17:00) Çalışıyor
tenant:track-resources Every 5 minutes Çalışıyor
generate:tenant-blogs Hourly (her saat başı) KAYITLI DEĞİL!

Sorun: Kernel.php'de komut tanımlı ama schedule listesinde görünmüyor!

3. Kod Analizi: Kernel.php (Satır 118-128)

// app/Console/Kernel.php

$schedule->command('generate:tenant-blogs')
         ->hourly() // Her saat başı
         ->withoutOverlapping(10)
         ->runInBackground()
         ->appendOutputTo(storage_path('logs/blog-cron.log'))
         ->onSuccess(function () {
             \Log::channel('daily')->info('✅ Blog Cron Success');
         })
         ->onFailure(function () {
             \Log::channel('daily')->error('❌ Blog Cron Failed');
         });

Tespit: Komut tanımı DOĞRU, ama Laravel bu komutu schedule listesine eklemiyor!

4. Manuel Test Sonuçları

Test 1: Komut manuel çalıştırma

$ php artisan generate:tenant-blogs --test

✅ BAŞARILI! Komut çalışıyor ve mantık doğru.
- Saat: 05 (Aktif saatler: 0, 3, 6, 9, 12, 15, 18, 21)
- Tenant 1: Skipped (saat aktif değil)
- Tenant 2: Skipped (saat aktif değil)
- Tenant 3: Skipped (AI disabled)

Test 2: Log kontrolü (21:00 testleri)

storage/logs/blog-cron.log:
- 21:05: Tenant 1 draft #5 seçildi → Blog job dispatched ✅
- 21:05: Tenant 2 draft #332 seçildi → Blog job dispatched ✅
- 21:10: Tenant 1 draft #2 seçildi → Blog job dispatched ✅
- 21:10: Tenant 2 draft #333 seçildi → Blog job dispatched ✅

Sonuç: Komut MANUEL çalıştırıldığında her şey mükemmel çalışıyor!

🐛 Sorunun Kök Nedeni

Olası Nedenler

1. Command Registration Eksik

Komut Kernel.php'de tanımlı ama commands() metodunda register edilmemiş olabilir.

2. Service Provider Sıralaması

BlogServiceProvider, Kernel schedule'dan önce yüklenmiyor olabilir.

3. Cache Sorunu

Laravel route/config cache'i eski schedule bilgilerini tutabilir.

4. Command Class İsim Çakışması

Signature doğru ama class namespace'i hatalı olabilir.

✅ Çözüm Adımları

Adım 1: Cache Temizleme

Laravel'in tüm cache'lerini temizleyerek schedule listesini yenile:

php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan schedule:clear-cache

Adım 2: Command Registration Kontrolü

Kernel.php'de commands() metodunu kontrol et:

protected function commands(): void
{
    $this->load(__DIR__.'/Commands');
    require base_path('routes/console.php');
}

// ✅ Bu zaten mevcut, Commands klasörü yükleniyor

Adım 3: Schedule Test

Cache temizlendikten sonra schedule listesini tekrar kontrol et:

php artisan schedule:list | grep generate

// Beklenen çıktı:
// 0 * * * * php artisan generate:tenant-blogs  Next Due: X dakika sonra

Adım 4: Manuel Tetikleme (Geçici Çözüm)

Eğer schedule hala çalışmazsa, geçici olarak crontab'a direkt ekle:

crontab -e

# Her saat başı blog üret (0. dakika)
0 * * * * cd /var/www/vhosts/tuufi.com/httpdocs && /usr/bin/php artisan generate:tenant-blogs >> storage/logs/blog-cron.log 2>&1

NOT: Bu geçici bir çözümdür. Asıl sorun Laravel scheduler'ın komutu görmemesi.

Adım 5: Verification (Doğrulama)

Sistem çalışıyor mu kontrol et:

// 1. Bir sonraki aktif saati bekle (örn. saat 6, 9, 12...)
// 2. Log dosyasını kontrol et:
tail -f storage/logs/blog-cron.log

// Beklenen çıktı:
// "✅ Blog generation job dispatched"

// 3. Horizon'da job'u kontrol et:
// https://ixtif.com/admin/horizon/jobs

// 4. Blog listesini kontrol et:
// https://ixtif.com/admin/blog (yeni blog eklenmiş mi?)

📊 Sistem Bilgileri

Bileşen Durum Detay
Crontab Aktif Her dakika schedule:run çalışıyor
Horizon Aktif 1 gün 3 saat uptime, 15 worker
blog-ai Queue Tanımlı ai-supervisor → max 50 jobs, 20dk timeout
Draft Pool Dolu 352 draft hazır (Tenant 2)
Tenant Settings Aktif AI enabled, 8 blog/day
Active Hours Yapılandırılmış 0, 3, 6, 9, 12, 15, 18, 21
Schedule Registration Sorunlu Komut listede görünmüyor!

🎯 Sonuç ve Öneri

Ana Sorun: generate:tenant-blogs komutu Laravel Scheduler tarafından tanınmıyor.

İlk Yapılacak: Cache temizleme ve schedule listesini kontrol etme.

Eğer Çözülmezse: Crontab'a direkt komut ekleyerek geçici çözüm.

Sistem Hazırlığı: Tüm altyapı hazır (Horizon, Queue, Drafts, Settings) - sadece scheduler registration sorunu var.

Beklenen Sonuç: Cache temizlendikten sonra sistem otomatik olarak çalışmaya başlamalı.