مبدأ إعادة التشغيل السلس

ما هو إعادة التشغيل السلس؟

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

تُستخدم إعادة التشغيل السلس عمومًا في عمليات تحديث الأعمال أو إصدار الإصدارات، حيث يمكن أن تتجنب تأثيرات عدم توفر الخدمة مؤقتًا نتيجة إعادة تشغيل الخدمة بسبب تحديث الرمز.

تنويه
لا يدعم نظام Windows الإعادة التحميل.

تنويه
في حالة الخدمات ذات الاتصال الطويل (على سبيل المثال websocket)، سيتم فصل الاتصالات أثناء إعادة التشغيل السلس. الحل هو استخدام هيكل مثل gatewayWorker، حيث تحتفظ مجموعة من العمليات بالاتصال وتضبط خاصية reloadable لهذه المجموعة من العمليات على القيمة "خطأ". تؤدي العمليات الأخرى لبدء منطق الأعمال ويتم استدعاء البوابة والعمليات عن طريق التواصل عبر اتصال TCP. عند الحاجة إلى تغيير العمل، يتم إعادة تشغيل عمليات العامل فقط.

القيود

ملاحظة: فقط الملفات التي تم تحميلها في callback on{...} ستتم إعادة تحميلها تلقائياً بعد إعادة التشغيل السلس، أما الملفات التي تم تحميلها مباشرة في سيناريو البدء أو الرمز الثابت لن يتم تحديثها عند تشغيل reload.

الشفرة التالية لن يتم تحديثها بعد reload

$worker = new Worker('http://0.0.0.0:1234');
$worker->onMessage = function($connection, $request) {
    $connection->send('hi'); // الرمز الثابت لا يدعم التحديث الساخن
};
$worker = new Worker('http://0.0.0.0:1234');
require_once __DIR__ . '/your/path/MessageHandler.php'; // الملفات التي تم تحميلها مباشرة في السيناريو البدء لا تدعم التحديث الساخن
$messageHandler = new MessageHandler();
$worker->onMessage = [$messageHandler, 'onMessage']; // فرضاً أن لديك دالة onMessage في فئة MessageHandler

الشفرة التالية ستتم تحديثها تلقائياً بعد reload

$worker = new Worker('http://0.0.0.0:1234');
$worker->onWorkerStart = function($worker) { // onWorkerStart هو callback يتم استدعاؤه بعد بدء العمل
    require_once __DIR__ . '/your/path/MessageHandler.php'; // الملفات التي تم تحميلها بعد بدء العمل تدعم التحديث الساخن
    $messageHandler = new MessageHandler();
    $worker->onMessage = [$messageHandler, 'onMessage'];
};

بعد إجراء أي تغيير في MessageHandler.php، يتم تنفيذ php start.php reload، حيث سيتم إعادة تحميل MessageHandler.php في الذاكرة لتحقيق تحديث منطق الأعمال.

ملاحظة
تم استخدام الشفرة أعلاه لأغراض العرض، لذا يتم استخدام عبارة require_once، إذا كان مشروعك يدعم التحميل التلقائي لـ psr4 ، فلن تكون هناك حاجة لاستدعاء عبارة require_once.

مبدأ إعادة التشغيل السلس

Workerman يتكون من عملية رئيسية وعمليات فرعية، حيث تتولى العملية الرئيسية مراقبة العمليات الفرعية، بينما تتولى العمليات الفرعية استقبال اتصالات العملاء وبيانات الطلب المرسلة عبر الاتصال، والقيام بالمعالجة المناسبة وإعادة البيانات إلى العميل. عندما يتم تحديث رمز الأعمال، يجب تحديث العمليات الفرعية فقط من أجل تحقيق هدف تحديث الرمز.

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

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