مبدأ إعادة التشغيل السلس
ما هي إعادة التشغيل السلسة؟
إعادة التشغيل السلسة تختلف عن إعادة التشغيل العادية، حيث يمكن إعادة تشغيل الخدمة (عادة ما تشير إلى خدمات الروابط القصيرة) دون التأثير على المستخدم، مما يسمح بإعادة تحميل برنامج PHP وإكمال تحديث كود الأعمال.
عادة ما يتم تطبيق إعادة التشغيل السلسة أثناء تحديث الأعمال أو نشر الإصدار، مما يمكن أن يتجنب التأثير السلبي لعدم توفر الخدمة بشكل مؤقت بسبب نشر الكود وإعادة تشغيل الخدمة.
تنبيه
نظام Windows لا يدعم reload.تنبيه
بالنسبة للأعمال المعتمدة على الاتصالات الطويلة (مثل websocket)، ستُقطع الاتصالات عند إعادة تشغيل العمليات بسلاسة. الحل هو استخدام بنية مشابهة لـ gatewayWorker، حيث يتم تخصيص مجموعة من العمليات للحفاظ على الاتصالات، ويتم تعيين خاصية reloadable لهذه المجموعة إلى false. يتم تشغيل مجموعة أخرى من عمليات worker لمعالجة منطق الأعمال، وتتواصل عملية الـ gateway مع عمليات worker عبر بروتوكول TCP. عند الحاجة لتغيير الأعمال، يتم إعادة تشغيل عمليات worker فقط.
القيود
تنبيه: فقط الملفات التي تم تحميلها في استدعاء 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']; // لنفترض أن فئة MessageHandler تحتوي على طريقة onMessage
الكود التالي سيحدث له تحديث تلقائي بعد reload
$worker = new Worker('http://0.0.0.0:1234');
$worker->onWorkerStart = function($worker) { // onWorkerStart هو استدعاء يتم تنفيذه بعد بدء العملية
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 من عملية رئيسية وعمليات فرعية، حيث تقوم العملية الرئيسية بمراقبة العمليات الفرعية، وتقوم العمليات الفرعية باستقبال اتصالات العملاء وبيانات الطلبات الواردة ومعالجتها وإرجاع البيانات للعملاء. عند تحديث كود الأعمال، ما نحتاج إلى القيام به فعليًا هو تحديث العمليات الفرعية، وذلك لتحقيق هدف تحديث الكود.
عندما تتلقى العملية الرئيسية لـ Workerman إشارة إعادة التشغيل السلسة، سترسل العملية الرئيسية إشارة خروج آمن لأحد العمليات الفرعية (تسمح للعملية المقابلة بإكمال الطلب الحالي قبل الخروج)، وعند خروج هذه العملية، ستقوم العملية الرئيسية بإعادة إنشاء عملية فرعية جديدة (هذه العملية الفرعية تحميل كود PHP الجديد)، ثم تعود العملية الرئيسية لإرسال أمر التوقف إلى عملية قديمة أخرى، وستستمر هذه العملية من عملية إلى أخرى حتى يتم استبدال جميع العمليات القديمة.
نرى أن إعادة التشغيل السلسة فعليًا تجعل العمليات القديمة تتوقف واحدة تلو الأخرى ثم تقوم بإنشاء عمليات جديدة واحدة تلو الأخرى. من أجل عدم التأثير على المستخدمين أثناء إعادة التشغيل السلسة، يتطلب ذلك عدم حفظ معلومات الحالة ذات الصلة بالمستخدمين داخل العمليات، أي من الأفضل أن تكون عمليات الأعمال بلا حالة، لتجنب فقدان المعلومات نتيجة خروج العمليات.