قوائم المهام في PHP: دليل عملي شامل

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

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

ابدأ الدورة

العمل مع قوائم المهام في PHP: دليل عملي شامل

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n
    \n
  • زيادة الأداء - لا ينتظر المستخدم اكتمال العمليات الثقيلة
  • \n
  • مقاومة الأعطال - إذا لم يتم تنفيذ المهمة، تعود إلى القائمة لإعادة المعالجة
  • \n
  • قابلية التوسع - يمكن تشغيل أي عدد من العمال للمعالجة المتوازية
  • \n
  • تخزين مؤقت للحمل - تعمل القائمة على تخفيف الأحمال الذروة على النظام
  • \n
\n\n

الأدوات الشائعة للعمل مع قوائم المهام في PHP

\n\n

1. RabbitMQ

\n

RabbitMQ هو وسيط رسائل قوي يدعم بروتوكول AMQP. وهو مثالي للسيناريوهات المعقدة لتوجيه الرسائل ويتطلب تثبيت خادم منفصل.

\n\n
// التثبيت عبر Composer
composer require php-amqplib/php-amqplib

// إرسال مهمة إلى القائمة
<?php
require_once 'vendor/autoload.php';

use PhpAmqpLib\\Connection\\AMQPStreamConnection;
use PhpAmqpLib\\Message\\AMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('email_queue', false, true, false, false);

$data = json_encode([
    'to' => 'user@example.com',
    'subject' => 'مرحبًا!',
    'body' => 'رسالة اختبار'
]);

$msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($msg, '', 'email_queue');
$channel->close();
$connection->close();
?>
\n\n

2. Redis + php-resque

\n

Redis هو مخزن سريع في الذاكرة (in-memory) مثالي لقوائم المهام البسيطة. php-resque هو نسخة PHP من مكتبة Resque الشهيرة في Ruby.

\n\n
// التثبيت
composer require chrisboulton/php-resque

// إنشاء مهمة
<?php
class SendEmailJob
{
    public function perform()
    {
        $args = $this->args;
        // منطق إرسال البريد الإلكتروني
        mail($args['to'], $args['subject'], $args['body']);
    }
}

// الإضافة إلى القائمة
Resque::setBackend('localhost:6379');
Resque::enqueue('default', 'SendEmailJob', [
    'to' => 'user@example.com',
    'subject' => 'مرحبًا',
    'body' => 'اختبار'
]);
?>
\n\n

3. Beanstalkd

\n

Beanstalkd هو مدير قوائم خفيف وسريع وموثوق. سهل التثبيت والتكوين، مما يجعله خيارًا ممتازًا للمشاريع الصغيرة.

\n\n
// التثبيت
composer require pda/pheanstalk

// إرسال مهمة
<?php
require_once 'vendor/autoload.php';

use Pheanstalk\\Pheanstalk;

$pheanstalk = Pheanstalk::create('127.0.0.1:11300');
$pheanstalk->useTube('email_tube')->put(
    json_encode(['to' => 'user@example.com', 'subject' => 'Test']),
    Pheanstalk::DEFAULT_PRIORITY,
    Pheanstalk::DEFAULT_DELAY,
    60 // TTR (time to run)                

المدونات

توصيات الكتب