مهمة الـcron تشغّل أمراً وفق جدول زمني، في الخلفية، سواء كان أحد يزور موقعك أم لا. يغطي هذا الدليل إضافة مهمة في KPanel، وكتابة الجدول الزمني والأمر بشكل صحيح لهذه المنصة، واستبدال المجدوِل المدمج غير الموثوق في WordPress، وإيجاد المخرجات عندما لا تؤدي المهمة ما كنت تتوقعه.
أين يوجد الـCron في KPanel
ينتمي الـcron إلى موقع معين، لذا تصل إليه من الموقع وليس من القائمة الرئيسية:
- سجّل الدخول إلى KPanel وانقر على المواقع في الشريط الجانبي الأيسر.
- انقر على الموقع الذي تريده.
- في قائمة الموقع الخاصة به، افتح الإعدادات، ثم Cron.
العنوان المباشر هو /websites/<site-id>/cron. سترى جدولاً بالمهام الحالية، أو حالة فارغة إذا لم يكن لدى الموقع أي مهام.

إضافة مهمة
انقر على إضافة مهمة Cron في أعلى اليمين. يحتوي النموذج على ثلاثة حقول.
الجدول الزمني
ستة أزرار جاهزة تملأ التعبير نيابة عنك:
| الزر | التعبير |
|---|---|
| كل دقيقة | * * * * * |
| كل 5 دقائق | */5 * * * * |
| كل ساعة | 0 * * * * |
| يومياً الساعة 2 صباحاً | 0 2 * * * |
| أسبوعياً الأحد | 0 2 * * 0 |
| شهرياً الأول | 0 2 1 * * |
أو اكتب تعبيرك الخاص في تعبير Cron. الحقول الخمسة، بالترتيب، هي الدقيقة، الساعة، يوم الشهر، الشهر، يوم الأسبوع:
minute hour day-of-month month day-of-week
0 3 * * *يعمل عند الساعة 3:00 صباحاً كل يوم.*/15 * * * *يعمل كل خمس عشرة دقيقة.0 9 * * 1يعمل عند الساعة 9:00 صباحاً كل يوم اثنين.30 1 1 * *يعمل عند الساعة 1:30 صباحاً في أول كل شهر.0 */6 * * *يعمل كل ست ساعات، عند بداية الساعة.
التسمية
اسم ستتعرف عليه لاحقاً، مثل WordPress cron أو Nightly stock sync. فهذا ما يعرضه لك جدول المهام، لذا اجعله وصفياً: job 3 لا يفيد أحداً في الساعة 2 صباحاً.
الأمر
أمر الصدفة (shell) المراد تشغيله. انقر على Save لإنشاء المهمة.
استخدم مسارات كاملة. يعمل الـcron ببيئة محدودة بلا أي من إعدادات الصدفة الخاصة بك، لذا فإن استخدام أمر مجرد مثل php أو مجلد نسبي يعمل عندما تكون مسجلاً عبر SSH سيفشل هنا بصمت. اكتب المسار كاملاً، في كل مرة.
كتابة الأمر
تعمل المهام بصفتها مستخدم النظام الخاص بموقعك، لذا فإن مجلدك الرئيسي هو المرجع الصحيح ويُحلّ ~ بشكل صحيح. تقع ملفات موقعك في:
~/htdocs/yourdomain.co.nz
يمكنك التأكد من المسار الدقيق في تبويب الإعدادات، ثم SFTP الخاص بالموقع، والذي يعرضه أسفل ملفات الموقع.
أوامر نموذجية:
cd ~/htdocs/yourdomain.co.nz && /usr/bin/wp cron event run --due-now
cd ~/htdocs/yourdomain.co.nz && /usr/bin/php bin/send-queued-emails.php
/usr/bin/curl -fsS https://yourdomain.co.nz/api/nightly-report
اختبر الأمر قبل جدولته. الصقه في قسم WordPress، ثم Console الخاص بالموقع إذا كان أمر wp، أو شغّله عبر SSH. من الأسهل بكثير اكتشاف مهمة لم تكن ستعمل أبداً عند سطر الأوامر مقارنة باكتشافها الساعة 3 صباحاً في ملف سجل.
استبدال المجدوِل المدمج في WordPress
يأتي WordPress مزوداً بمجدوِله الوهمي الخاص، WP-Cron، الذي لا يعمل إلا عند تحميل أحد ما لصفحة. في موقع هادئ، تُنشر المقالات المجدولة متأخرة وتتراكم الرسائل غير المرسلة. وفي موقع مزدحم، يدفع كل زائر ثمن التحقق من الجدول الزمني.
تحلّ مهمة cron حقيقية هذه المشكلة بالكامل. يقوم KPanel بإجراء التبديل كاملاً نيابة عنك:
- افتح الموقع، ثم تبويب WordPress.
- افتح قسم WP-Cron.
- انقر على تفعيل نظام cron.
يضيف ذلك جدولاً يشغّل WP-Cron كل خمس دقائق ويضبط DISABLE_WP_CRON حتى تتوقف تحميلات الصفحات عن تشغيله أيضاً. يعكس إزالة cron النظام في الشاشة نفسها كلا الجزأين.
إن كنت تفضّل القيام بذلك يدوياً، فهي خطوتان:
تعطيل النسخة التي يشغّلها الزوار. أضف هذا إلى wp-config.php، فوق سطر /* That's all, stop editing! */، باستخدام الإعدادات، ثم مدير الملفات:
define( 'DISABLE_WP_CRON', true );
إضافة المهمة الحقيقية. في الإعدادات، ثم Cron:
- الجدول الزمني:
*/5 * * * * - التسمية:
WordPress cron - الأمر:
cd ~/htdocs/yourdomain.co.nz && /usr/bin/wp cron event run --due-now
لا تتخطَّ نصف DISABLE_WP_CRON. فمع تشغيل كلا الجزأين، يمكن لكل مهمة مجدولة أن تعمل مرتين: رسائل مكررة، معالجة طلبات مكررة، رسوم مكررة على إضافة اشتراك. استخدم إجراء النقرة الواحدة في قسم WP-Cron ولن يحدث هذا معك.
WooCommerce وقوائم الانتظار في الخلفية
يستخدم WooCommerce قائمة انتظار في الخلفية لتغييرات حالة الطلبات، وتجديد الاشتراكات، ورسائل البريد الإلكتروني، وتحديثات المخزون. وهو يعتمد على WP-Cron، لذا فهو بالضبط نوع العمل الذي يتأثر سلباً في متجر هادئ.
بمجرد وضع الجدول الزمني الحقيقي، تتم معالجة قائمة الانتظار كل خمس دقائق. راقبها عبر WooCommerce، ثم Status، ثم Scheduled Actions في wp-admin.
يمكن لمتجر عالي الحجم الانتقال إلى */2 * * * *. النزول دون ذلك نادراً ما يساعد: ستقضي وقتاً في بدء العمليات أكثر مما تقضيه في العمل الفعلي. راجع إعداد WooCommerce.
إدارة المهام الحالية
يعرض جدول المهام Label، وSchedule، وCommand، وآخر تشغيل، وStatus، مع إجراءين لكل صف:
- Disable يوقف مهمة مؤقتاً دون حذفها، ويتحول إلى Enable لإعادتها. استخدم هذا عندما تختبر ما إذا كانت مهمة ما تسبب مشكلة.
- Delete يزيلها نهائياً. يُطلب منك التأكيد، وتتوقف عمليات التشغيل المجدولة فوراً.
لا يمكن التراجع عن حذف مهمة cron. تُزال الجدولة من الخادم في تلك اللحظة. إن كنت تحاول فقط إيقافها مؤقتاً، استخدم Disable.
إيجاد المخرجات
كل مهمة ينشئها KapsuleHost تُسجَّل مخرجاتها نيابة عنك. تُضاف المخرجات القياسية والأخطاء إلى ملف سجل في مجلد cron-logs ضمن المجلد الرئيسي لمستخدم موقعك، ملف واحد لكل مهمة.
ذلك السجل هو الإجابة عن كل سؤال تقريباً من نوع "هل عملت مهمتي؟"، لأنه يسجّل ما طبعه الأمر وأي خطأ أثاره.
لقراءته، اتصل عبر SSH وابحث في ~/cron-logs/. يستخدم SSH المصادقة بالمفاتيح، لذا أضف مفتاحك العام أولاً من تبويب الإعدادات، ثم مفاتيح SSH الخاص بالموقع: راجع إضافة مفاتيح SSH.
حسابات مدير الملفات وSFTP مقيَّدة بمجلد موقعك، ~/htdocs/yourdomain.co.nz، ويقع cron-logs مستوى واحد فوقه. هذا متعمَّد: فهو يبقي المقاول الذي لديه وصول عبر SFTP بعيداً عن كل شيء ما عدا الموقع نفسه. استخدم SSH الأصلي للوصول إلى السجلات، أو أعد توجيه المخرجات إلى مجلد موقعك كما هو موضح أدناه.
إن كنت تفضّل أن تكون المخرجات في مكان يمكن لمدير الملفات فتحه، أعد توجيهها بنفسك:
cd ~/htdocs/yourdomain.co.nz && /usr/bin/wp cron event run --due-now >> ~/htdocs/yourdomain.co.nz/wp-content/cron.log 2>&1
2>&1 يرسل الأخطاء إلى الملف نفسه الذي تذهب إليه المخرجات العادية. بدونه، لا تذهب الأخطاء إلى أي مكان.
أي شيء داخل مجلد موقعك يمكن احتمالاً طلبه عبر الويب. ضع سجلاً معاد توجيهه تحت wp-content بدلاً من جذر الموقع، وأعطه اسماً لا يمكن لأحد تخمينه، واحذفه بعد الانتهاء من التصحيح.
ممارسات جيدة
- وزّع جداولك الزمنية. ست مهام مضبوطة جميعاً على
0 2 * * *ستبدأ كلها دفعة واحدة. وزّعها:0 2،10 2،20 2. - لا تستخدم كل دقيقة إلا إذا كنت تحتاج ذلك فعلاً.
*/5كافٍ تقريباً لكل شيء، بما في ذلك WordPress وWooCommerce. - اجعل المهام قصيرة. المهمة التي تستغرق وقتاً أطول من فاصلها الزمني ستتداخل مع التشغيل التالي.
- أعد توجيه المخرجات لأي مهمة صاخبة، حتى لا تملأ مهمة ثرثارة واحدة قرصك الصلب.
- راجع القائمة من حين لآخر. المهام المتبقية من إضافة أزلتها تستمر في العمل.
استكشاف الأخطاء وإصلاحها
المهمة لا تعمل أبداً على ما يبدو. تحقق من المسار أولاً. افتح ملف السجل. ثم تأكد من أن الحالة Active وليست Disabled. ثم شغّل الأمر نفسه عبر SSH وانظر ماذا يقول.
"command not found" في السجل. مسار كامل مفقود. استخدم /usr/bin/php، /usr/bin/wp، /usr/bin/curl بدلاً من الاسم المجرد.
رُفض الإذن. تعمل المهمة بصفتها مستخدم نظام موقعك. يحتاج ذلك المستخدم إلى امتلاك، أو على الأقل القدرة على قراءة، كل شيء يلمسه الأمر. تحقق من الأذونات في استخدام مدير الملفات.
مهام WordPress لا تزال تعمل متأخرة. تأكد من وجود كلا جزأي التبديل: الجدول الزمني موجود في الإعدادات، ثم Cron، وDISABLE_WP_CRON مضبوط. يعرض قسم WP-Cron في تبويب WordPress الحالة الراهنة لكليهما.
المهمة تعمل لكن الموقع يصبح بطيئاً أثناء تشغيلها. انقلها إلى ساعة أكثر هدوءاً، أو قسّم العمل إلى دفعات أصغر. استخدام الموارد على مستوى الموقع مرئي تحت الأداء: راجع تحسين سرعة الموقع.
توقفت مهمة عن العمل بعد تحديث إضافة. ربما تغيّر مسار الأمر. تحقق من السجل، ثم حدّث الأمر من جدول المهام بحذف المهمة القديمة وإضافة أخرى مصححة.