قوائم المهام في PHP: دليل التنفيذ والتحسين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع قوائم المهام في PHP: من البسيط إلى المعقد



في تطبيقات الويب الحديثة، غالباً ما تنشأ الحاجة لتنفيذ عمليات تستهلك موارد كبيرة أو تستغرق وقتاً طويلاً دون إجبار المستخدم على الانتظار. إرسال إشعارات البريد الإلكتروني، إنشاء التقارير، معالجة الصور، التكامل مع واجهات برمجة التطبيقات الخارجية — كل هذه المهام مثالية للتنفيذ غير المتزامن. هنا تأتي قوائم المهام (job queues) للإنقاذ. في هذه المقالة، سننظر بالتفصيل في كيفية تنفيذ وتحسين العمل مع قوائم المهام في PHP، بدءاً من الحلول البسيطة وصولاً إلى الأدوات الصناعية.



ما هي قائمة المهام ولماذا نحتاجها؟



قائمة المهام (job queue) هي آلية تسمح بتأجيل تنفيذ بعض العمل إلى وقت لاحق. بدلاً من تنفيذ المهمة فوراً ضمن طلب HTTP، تقوم بوضعها في قائمة. يقوم عامل خاص (worker) أو مجموعة من العمال بسحب المهام من القائمة ومعالجتها في الخلفية.



المزايا الرئيسية لاستخدام قوائم المهام:

  • تسريع استجابة المستخدم: يحصل المستخدم على الرد فوراً، بينما يتم تنفيذ العمل الثقيل بشكل غير متزامن.
  • قابلية التوسع: يمكنك تشغيل عدة عمال لمعالجة المهام بالتوازي.
  • الموثوقية: إذا لم يتم تنفيذ المهمة (مثلاً بسبب خطأ مؤقت)، يمكن إعادة محاولتها لاحقاً.
  • تخفيف الحمل عن الخادم الرئيسي: العمليات الخلفية لا تمنع معالجة طلبات HTTP الجديدة.


قائمة مهام بسيطة تعتمد على قاعدة البيانات



أبسط طريقة لتنظيم قائمة مهام في PHP هي استخدام جدول في قاعدة البيانات (مثل MySQL). هذا النهج لا يتطلب تثبيت برامج إضافية وهو مناسب تماماً للمشاريع الصغيرة.



الخطوة 1: إنشاء جدول jobs

CREATE TABLE jobs (    id INT AUTO_INCREMENT PRIMARY KEY,    queue_name VARCHAR(255) DEFAULT 'default',    payload TEXT NOT NULL,    status ENUM('pending', 'processing', 'completed', 'failed') DEFAULT 'pending',    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,    available_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,    attempts INT DEFAULT 0);


الخطوة 2: إضافة مهمة إلى القائمة

function addJob(string $queueName, array $data): void {    $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');    $stmt = $pdo->prepare(        "INSERT INTO jobs (queue_name, payload, available_at)          VALUES (?, ?, NOW())"    );    $stmt->execute([$queueName, json_encode($data)]);}

// مثال على الاستخدامaddJob('emails', ['to' => 'user@example.com', 'subject' => 'مرحباً!']);


الخطوة 3: إنشاء العامل (worker.php)

// حلقة لا نهائية لمعالجة المهامwhile (true) {    $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');        // الاستيلاء على مهمة مع قفل الصف    $stmt = $pdo->prepare(        "SELECT * FROM jobs          WHERE status = 'pending' AND available_at <= NOW()          ORDER BY id ASC          LIMIT 1 FOR UPDATE"    );    $stmt->execute();    $job = $stmt->fetch(PDO::FETCH_ASSOC);        if ($job) {        // وضع علامة "قيد المعالجة"        $updateStmt = $pdo->prepare("UPDATE jobs SET status = 'processing' WHERE id = ?");        $updateStmt->execute([$job['id']]);                try {            // تنفيذ المهمة            $data = json_decode($job['payload'], true);            processJob($data);                        // وضع علامة كمكتملة            $pdo->prepare("UPDATE jobs SET status = 'completed' WHERE id = ?")                ->execute([$job['id']]);        } catch (Exception $e) {            // معالجة الخطأ            $attempts = $job['attempts'] + 1;            if ($attempts < 3) {                

المدونات

توصيات الكتب