مدير مهام PHP: مدير قوائم انتظار يشبه cron بلغة PHP

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

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

ابدأ الدورة

مدير مهام PHP: إدارة المهام الدورية في الكود



في تطوير الويب الحديث، غالبًا ما تنشأ الحاجة لتنفيذ إجراءات متكررة: إرسال النشرات البريدية، تنظيف ذاكرة التخزين المؤقت، إنشاء التقارير، مزامنة البيانات مع واجهات برمجة التطبيقات الخارجية. تقليديًا، يُستخدم cron النظامي (crontab) لهذا الغرض، لكنه يتطلب الوصول إلى shell والإعداد على الخادم. تتيح مكتبة مدير مهام PHP (Task Scheduler) تنفيذ سلوك يشبه cron مباشرةً داخل تطبيق PHP، دون الحاجة إلى تحرير crontab. هذا حل مثالي للاستضافة المشتركة، بيئات الحاويات (Docker)، أو المشاريع التي تحتاج إلى منطق جدولة مرن من الكود.



الإمكانيات الرئيسية



توفر المكتبة واجهة fluent لتعريف المهام وجدولتها. الوظائف الأساسية:



  • جدولة مرنة – دعم تعبيرات cron، الفواصل الزمنية (كل N دقيقة، ساعة، يوم)، وقت محدد (يوميًا في 03:00).
  • تنفيذ الأوامر ودوال الاستدعاء – يمكن تشغيل أوامر shell، دوال الفئات، أو الدوال المجهولة.
  • إدارة قوائم الانتظار – التكامل مع قوائم الانتظار (مثل RabbitMQ، Redis) للتنفيذ المؤجل.
  • التسجيل والإشعارات – دعم مدمج لسجلات التنفيذ، إرسال الأخطاء عبر البريد الإلكتروني أو إلى Sentry.
  • الأمان – منع التشغيل المتزامن لنفس المهمة (mutex).


التثبيت والإعداد



يتم التثبيت عبر Composer:



composer require vendor/task-scheduler


بعد التثبيت، يجب إنشاء ملف scheduler.php الذي سيتم تشغيله بواسطة cron النظامي (مرة واحدة في الدقيقة). داخل الملف، يتم إعداد جميع المهام:



<?phprequire_once __DIR__ . '/vendor/autoload.php';

use Scheduler\\Scheduler;use Scheduler\\Task;

$scheduler = new Scheduler();

// المهمة 1: تنظيف ذاكرة التخزين المؤقت كل 30 دقيقة$scheduler->add(new Task('cache:clear', function() { // منطق تنظيف ذاكرة التخزين المؤقت echo "Cache cleared at " . date('Y-m-d H:i:s') . PHP_EOL;}), '*/30 * * * *');

// المهمة 2: إرسال النشرة البريدية يوميًا في الساعة 9:00$scheduler->add(new Task('send:newsletter', 'php artisan newsletter:send'), '0 9 * * *');

// المهمة 3: تحديث الإحصائيات كل 5 دقائق، ولكن ليس أكثر من مرة كل 10 دقائق$scheduler->add(new Task('update:stats', function() { // عملية طويلة sleep(5);}), '*/5 * * * *', [ 'mutex' => true, // حماية من التشغيل المتزامن 'timeout' => 300 // أقصى وقت للتنفيذ (5 دقائق)]);

$scheduler->run();?>


في crontab النظامي، يتم إضافة السطر:



* * * * * php /path/to/scheduler.php >> /dev/null 2>&1


الآن سيتم تشغيل سكريبت PHP كل دقيقة والتحقق من المهام التي يجب تنفيذها.



أمثلة الاستخدام



1. مدير بسيط مع دالة استدعاء



<?php$scheduler->add(new Task('greet', function() {    echo "Hello, World!";}), '*/1 * * * *'); // كل دقيقة


2. تشغيل أمر Artisan في Laravel



<?php$scheduler->add(new Task('reports:generate', 'php artisan reports:generate --force'), '0 2 * * 1'); // كل يوم اثنين في الساعة 2:00


3. استخدام الفواصل الزمنية بدلاً من cron



<?phpuse Scheduler\\Interval;

$scheduler->add(new Task('backup:db', 'mysqldump -u root db > backup.sql'), Interval::everyHour());// أو$scheduler->add(new Task('cleanup:logs', 'rm -rf /var/log/old/*'), Interval::everyDays(7));


4. التنفيذ المؤجل عبر قائمة الانتظار



<?php$scheduler->add(new Task('process:payments', function() use ($queue) {    $queue->push(new                    

توصيات