PHP ile Veritabanı Tabanlı Kuyruk (Queue) Kurulumu

0 الردود 5 المشاهدات
·
المشاركون
صاحب الموضوع #1
PHP projelerinde zaman zaman arka planda işlemleri sıraya almak veya asenkron görevler düzenlemek gerekebilir. Bu gibi durumlarda, veritabanı tabanlı bir kuyruk sistemi kurmak, hem basit hem de güvenilir bir çözüm sunar. Bu yazıda, MySQL kullanarak PHP ile temel bir kuyruk yapısının nasıl oluşturulabileceğine detaylıca değineceğim. Bu sistem, özellikle büyük ölçekli olmayan uygulamalarda, kuyruk yönetimini kolaylaştırır ve performans açısından da yeterli olabilir.


İlk adım, kuyruk için uygun bir veritabanı yapısı oluşturmaktır. Basit bir örnekle, aşağıdaki gibi bir tablo tasarımı tercih edilir:

كود
12345678
CREATE TABLE [icode]queue[/icode] (
  [icode]id[/icode] INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  [icode]task_data[/icode] TEXT NOT NULL,
  [icode]status[/icode] ENUM('pending','processing','completed') DEFAULT 'pending',
  [icode]created_at[/icode] TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  [icode]processed_at[/icode] TIMESTAMP NULL
);


Burada, task_data alanı, yapılacak işlemin detayını JSON veya seri hale getirilmiş veri olarak saklar. status alanı, işlemin hangi aşamada olduğunu gösterir.

PHP tarafında, kuyruktan görev almak ve güncellemek için şu temel mantık izlenir:

  1. Yeni görev ekleme:

كود
123456
function enqueue($taskData) {
    global $db; // PDO veya mysqli bağlantısı
    $stmt = $db->prepare("INSERT INTO queue (task_data) VALUES (:task_data)");
    $stmt->execute([':task_data' => json_encode($taskData)]);
}


  1. Bir görevi almak ve işlemi başlatmak:

كود
12345678910111213141516
function dequeue() {
    global $db;
    $db->beginTransaction();
    $stmt = $db->prepare("SELECT * FROM queue WHERE status='pending' ORDER BY created_at LIMIT 1 FOR UPDATE");
    $stmt->execute();
    $task = $stmt->fetch();
    if ($task) {
        $update = $db->prepare("UPDATE queue SET status='processing' WHERE id=:id");
        $update->execute([':id' => $task['id']]);
        $db->commit();
        return $task;
    }
    $db->rollBack();
    return null;
}


  1. Görev tamamlandıysa güncelle:

كود
123456
function markComplete($id) {
    global $db;
    $stmt = $db->prepare("UPDATE queue SET status='completed', processed_at=NOW() WHERE id=:id");
    $stmt->execute([':id' => $id]);
}


Bu düzen, temel bir kuyruk mantığı sağlar. Gerçek kullanımda, hatalı işlemler veya tekrar denemeler için ek mekanizmalar, zaman aşımı ve işlem sıralama gibi ilave kontroller de eklenebilir. Ayrıca, performans ve ölçeklenebilirlik açısından, kuyruk işlemlerinin yoğun olduğu ortamlarda Redis veya RabbitMQ gibi mesaj brokerleri tercih edilmesi daha uygun olur.

Kendi uygulama ihtiyaçlarınıza göre bu temel yapıyı geliştirebilir, veya farklı veritabanı yapıları ve işlem algoritmaları kullanabilirsiniz.

يجب تسجيل الدخول للرد.

المستخدمون الذين يشاهدون هذا الموضوع (الإجمالي: 4, الأعضاء: 4, الضيوف: 0)
الإجمالي: 4 (الأعضاء: 4, الضيوف: 0)
0 اقتباسات محددة