Gereksinimler ve Ön Hazırlık
Sistemi kurmaya başlamadan önce, projenizin temel gereksinimlerini karşıladığından emin olmalısınız. Laravel'in zamanlayıcı yapısı, sunucu düzeyinde bir "Cron job" kurulumuna ihtiyaç duyar.
- PHP 8.2 veya üzeri bir sürüm.
- Laravel 11.x kurulu bir proje ortamı.
- Sunucunuzda veya yerel geliştirme ortamınızda bir Cron job tanımlama yetkisi.
- Veritabanı yönetimi için MySQL veya PostgreSQL.
Öncelikle, içeriklerinizi tutacağınız bir tabloya ihtiyacımız var. İçeriklerin durumunu kontrol etmek için status ve zamanlamasını belirlemek için published_at sütunlarını içeren bir migration oluşturmalıyız.
// terminal komutu ile migration oluşturma
php artisan make:migration create_posts_table
Veritabanı Yapılandırması ve İçerik Modeli
İçeriklerin zamanlanmış bir şekilde yönetilmesi için veritabanı şemanızın doğru kurgulanması gerekir. published_at alanı, içeriğin yayına gireceği anı temsil ederken, status alanı içeriğin "taslak", "zamanlanmış" veya "yayında" olduğunu belirler.
// database/migrations/xxxx_create_posts_table.php
public function up(): void
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('content');
$table->string('status')->default('draft'); // draft, scheduled, published
$table->timestamp('published_at')->nullable();
$table->timestamps();
});
}
Model dosyanızda, published_at alanını tarih formatında işlememiz için $casts dizisine eklememiz önemlidir. Bu, Laravel'in tarihleri Carbon nesnesi olarak ele almasını sağlar.
// app/Models/Post.php
protected $casts = [
'published_at' => 'datetime',
];
Laravel Zamanlayıcı (Scheduler) Kurulumu
Laravel'in kendi zamanlayıcısı, routes/console.php dosyası üzerinden yönetilir. Burada, her dakika çalışan bir görev tanımlayarak, veritabanındaki zamanı gelmiş içerikleri bulup durumlarını güncelleyeceğiz.
// routes/console.php
use Illuminate\Support\Facades\Schedule;
use App\Models\Post;
use Carbon\Carbon;
Schedule::call(function () {
Post::where('status', 'scheduled')
->where('published_at', 'where('published_at', '
İleri Seviye Zamanlama ve Performans Optimizasyonu
Zamanlayıcı (Scheduler) sisteminiz büyüdükçe, veritabanı sorgularının verimliliği kritik bir hal alır. Binlerce gönderinin olduğu bir sistemde, her dakika tüm veritabanını taramak yerine, sadece zamanı gelmiş olanları hedefleyen dizinlenmiş (indexed) sorgular kullanmalısınız. Aksi takdirde, published_at sütunu üzerinde bir indeks tanımlanmamışsa, sorgu süreniz lineer olarak artacaktır.
Performansı artırmak için veritabanı göç dosyanızda şu değişikliği yapmayı unutmayın:
// database/migrations/xxxx_add_index_to_posts_table.php
public function up()
{
Schema::table('posts', function (Blueprint $table) {
$table->index(['status', 'published_at']);
});
}
Ayrıca, her dakika çalışan bir görev yerine, büyük ölçekli uygulamalarda Laravel Queues (Kuyruklar) yapısını kullanmak, ana iş parçacığının (main thread) kilitlenmesini önler. Zamanlayıcı sadece bir "tetikleyici" görevi görmeli, ağır işleri ise arka plan işçileri (workers) yapmalıdır.
Hata Ayıklama ve Loglama Stratejileri
Otomatik zamanlama sistemlerinde en büyük sorun, görevin sessizce başarısız olmasıdır. Bir gönderi yayınlanamadığında bunun nedenini bilmek için try-catch blokları ve Laravel'in Log cephesini kullanmak hayati önem taşır. Görevlerinizi routes/console.php içinde tanımlarken şu yapıyı tercih edin:
use Illuminate\Support\Facades\Log;
Schedule::call(function () {
try {
$posts = Post::where('status', 'scheduled')
->where('published_at', '> /dev/null 2>&1
Bu satır, sunucunun her dakika Laravel'in zamanlayıcısını kontrol etmesini sağlar. Eğer sunucunuzda birden fazla Laravel projesi varsa, her projenin yolunu doğru verdiğinizden ve www-data gibi ilgili kullanıcı yetkilerine sahip olduğunuzdan emin olun.


Yorumlar (0)
Yorum Yaz