قبل البدء في التطوير
عند استخدام Workerman لتطوير التطبيقات، يجب عليك أن تكون على دراية بالمواضيع التالية:
1. الاختلافات بين تطوير Workerman وتطوير PHP العادي
بالإضافة إلى عدم القدرة على استخدام المتغيرات والوظائف المتعلقة ببروتوكول HTTP مباشرة، فإن تطوير Workerman لا يختلف كثيرًا عن تطوير PHP العادي.
1.1. فرق في طبقة التطبيق
- تعتمد تطوير PHP العادي عادةً على بروتوكول التطبيق HTTP، حيث يكون خادم الويب قد قام بتحليل البروتوكول بالفعل.
- يدعم Workerman مختلف البروتوكولات، حيث تم دمج بروتوكولات مثل HTTP وWebSocket داخله. ويُوصَى Workerman بأن يستخدم المطورون بروتوكولات تواصل مخصصة أكثر بساطة.
1.2. اختلاف دورة الطلب
- تقوم PHP في التطبيقات الويب بتحرير جميع المتغيرات والموارد بعد كل طلب.
- يعتمد تطوير التطبيقات بواسطة Workerman على دخول التطبيق إلى الذاكرة بعد تحليله للمرة الأولى والإبقاء عليه هناك، مما يعني عدم الإفراج عن تعريفات الصف، والكائنات العامة، وأعضاء الصف الثابتة بعد ذلك، ويجعل من السهل إعادة استخدامها لاحقًا.
1.3. تجنب تكرار تعريفات الصف والثوابت
- نظرًا لأن Workerman سيقوم بتخزين ملف PHP المترجم، فيجب تجنب تضمين نفس التعريفات مرارًا وتكرارًا، ويُفضل استخدام require_once أو include_once لتحميل الملفات.
1.4. التأكد من إطلاق المورد المتصل بوضع البيانات فقط
- نظرًا لعدم إفراج Workerman عن الكائنات العامة وأعضاء الصف الثابتة بعد كل طلب، يوصى باستخدام وسيلة الإفراج عن المورد (مثل اتصال قاعدة البيانات) في أوضاع الفردية بمساعدة Workerman.
1.5. تجنب استخدام تعليمات الخروج
- عندما يعمل Workerman في وضع سطر الأوامر PHP، سيؤدي استدعاء تعليمات الخروج مثل exit وdie إلى إغلاق العملية الحالية. على الرغم من أن العمليات الفرعية ستكون قادرة على إعادة إنشاء نفس العملية الفرعية على الفور لمواصلة الخدمة، إلا أنه من الممكن أن تؤثر بشكل سلبي على الأعمال.
1.6. إعادة تشغيل الخدمة بعد تعديل الكود
نظرًا لبقاء Workerman في الذاكرة باستمرار، وبمجرد تحميل تعريفات الفئة أو الوظيفة مرة واحدة، فإن كل تغيير في الكود يتطلب إعادة التشغيل ليصبح فعالًا.
2. المفاهيم الأساسية التي يجب معرفتها
2.1. بروتوكول نقل الطبقة TCP
TCP هو نوع من بروتوكولات النقل على الإنترنت التي تعتمد على الاتصال وتعتمد على IP. واحدة من السمات الهامة لبروتوكول نقل TCP هي أنه يعتمد على تدفق البيانات، حيث يمكن أن ترسل الطلبات من العميل إلى الخادم بشكل متواصل دون توفير بيانات كاملة في كل مرة، ويحتاج خادم الويب إلى تمييز حدود كل طلب داخل تدفق البيانات. ويعتمد بروتوكول التطبيق في المقام الأول على تحديد مجموعة من القواعد لحدود الطلبات من أجل تجنب فوضى البيانات.
2.2. بروتوكول التطبيق
يحدد بروتوكول التطبيق كيفية تبادل رسائل التوجيه بين عمليات التطبيق المختلفة (العميل والخادم) التي تعمل على أنظمة نهاية مختلفة. على سبيل المثال، تعتبر HTTP وWebSocket من بروتوكولات التطبيق. على سبيل المثال، يمكن أن يكون بروتوكول التطبيق البسيط على النحو التالي: {"module":"user","action":"getInfo","uid":456}، حيث يتم وضع توقف السطر كنهاية للطلب ويتم تمثيل الجسم كسلسلة نصية.
2.3. الاتصال قصير المدى
الاتصال القصير يشير إلى إنشاء اتصال على نحو واحد فقط عندما يكون هناك تبادل للبيانات بين الطرفين، وعندما ينتهي إرسال البيانات، يتم فصل هذا الاتصال. ومثال على ذلك هو خدمة HTTP لمواقع الويب.
2.4. الاتصال الطويل
الاتصال الطويل يتيح إرسال مجموعة من حزم البيانات عبر اتصال واحد. يجب مراعاة أن يحتوي التطبيق ذو الاتصال الطويل على إشارة أو "نبض" للتأكد من عدم فصل الاتصال بواسطة جدار حماية الشبكة بسبب عدم النشاط لفترة زمنية طويلة.
2.5. إعادة التشغيل السلسة
إعادة التشغيل السلسة هي عملية تتكون من إيقاف العمليات تباعًا دون إيقاف جميع العمليات مرة واحدة، حيث يتم إعادة بدء العمليات بديلة في الوقت نفسه.
يرجى ملاحظة: ستحدث التحديثات تلقائيًا بعد إعادة تشغيل الملف المحمل في callback on{...} من خلال Workerman. لن يتم تشغيل الشفرة التي تم وضعها بعد Worker::runAll().
3. التمييز بين العملية الرئيسية والعمليات الفرعية
من المهم مراعاة ما إذا كانت الشفرة تعمل في العملية الرئيسية أم في العمليات الفرعية. وبشكل عام، أي شيء يتم تشغيله قبل Worker::runAll() سيتم تشغيله في العملية الرئيسية، وبينما سيتم تشغيل الشفرة التي تم وضعها في callback onXXX في العمليات الفرعية. عليك تجنب تهيئة اتصالات قاعدة البيانات، الذاكرة المؤقتة وRedis في العملية الرئيسية، حيث أن اتصالات العملية الرئيسية قد تورث عن طريق العمليات الفرعية (الخاصة بالأساس وبالذات عند استخدام مفتاح)، مما يؤدي إلى قراءة البيانات المختلطة. من الأفضل تهيئة موارد الاتصال في callback onWorkerStart.