PHP غير متزامن. لماذا؟

صورة

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

تقديم ترجمة مقال من قبل المطور الخلفي Skyeng سيرجي جوك.

استجابة التطبيق


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

التزامن والتزامن


عندما يرى الناس رمزًا غير متزامن ، فغالبًا ما يفكرون على الفور: "عظيم ، يمكنني موازاة العمليات!". قد أخيب ظنك ، لكن في الحقيقة لم يحدث ذلك. التزامن والتزامن ليسا نفس الشيء. قد يكون من الصعب تحديد هذا الاختلاف ، لذلك دعونا نحاول معرفة ذلك.

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

غير المتزامن:
اذهب واكمل المهمة بنفسك . اسمحوا لي أن أعرف متى انتهيت وأريني النتيجة. في هذا الوقت ، يمكنني الاستمرار في أداء وظيفتي.

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

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

لا يعمل Nginx مثل Apache - فهو لا ينشئ سلاسل رسائل جديدة لكل طلب وارد. يحتوي Nginx على سير عمل رئيسي (أو عدة عمال ، غالبًا ما يوجد لمعالج واحد سير عمل واحد) ، وهو مترابط واحد. يمكن لهذا العامل معالجة آلاف الاتصالات "بشكل متزامن" ويقوم بذلك بشكل غير متزامن ، في مؤشر ترابط واحد ، وليس بالتوازي في عدة مؤشرات ترابط.

وبالتالي ، "عدم التزامن" هو كيفية بناء النظام ، فهو عبارة عن تركيبة عمليات مستقلة عن بعضها البعض. يقصد بـ "التنفيذ الموازي" تنفيذ العديد من العمليات في نفس الوقت في الوقت المناسب ، في حين أنها قد تكون أو لا تكون ذات صلة. في التنفيذ غير المتزامن ، نقوم بمعالجة العديد من المهام في وقت واحد ، وفي التنفيذ المتوازي ، نبدأ عدة عمليات في وقت واحد. قد يبدو هذا هو نفس الشيء ، لكنه ليس كذلك. يصف عدم التزامن بنية ، التوازي يصف طريقة للقيام بذلك.

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

ماذا عن هذه الخلفية؟


يمكنك أن تقول أن الاستجابة ليست مهمة على الواجهة الخلفية. تحدث كل هذه الأشياء الرائعة غير المتزامنة مع JavaScript على freeend ، ويستجيب الخادم الخاص بك فقط للطلبات ، لذلك يجب أن يكون freeend مسؤولاً عن استجابة التطبيق ، ولكن ليس أنت. نعم ، هذا صحيح ، لكن مهمة الخادم لا تقتصر على استجابات API. في بعض الأحيان ، يتعين عليك إدارة المهام المعقدة ، على سبيل المثال ، تنزيل مقطع فيديو. في هذه الحالة ، قد لا تكون الاستجابة عاملاً رئيسيًا ، لكن نقص الموارد يضيع نظرًا لأن التطبيق يجب أن يكون خاملاً. يمكن أن تنتظر إكمال عمليات نظام الملفات وتفاعلات الشبكة واستعلامات قاعدة البيانات وما شابه. غالبًا ما تكون عمليات الإدخال / الإخراج هذه بطيئة جدًا مقارنة بحسابات المعالج ، على سبيل المثال عندما نقوم بتحويل ملفات الفيديو. وبينما نقوم بحفظ الملف أو قراءته ببطء ، يضطر المعالج إلى الاستعداد بدلاً من القيام بعمل مفيد. كما اكتشفنا بالفعل ، بدلاً من الانتظار ، يمكننا تشغيل هذه المهام في الخلفية. كيف؟ المضي قدما.

PHP غير متزامن


في JavaScript ، من خارج الصندوق ، يتوفر دعم مدمج وحلول لكتابة كود غير متزامن. يوجد أيضًا Node.js ، والذي يسمح لك بكتابة تطبيقات الخادم غير المتزامن. في JavaScript ، يمكننا استخدام وظيفة setTimeout () لإظهار مثال على التعليمات البرمجية غير المتزامنة:
صورة

عند تشغيل هذا الرمز ، سنرى ما يلي:
صورة

ترسل الدالة setTimeout () الرمز إلى قائمة الانتظار وتنفيذه في نهاية مكدس الاستدعاءات الحالي. هذا يعني أننا نعطل التدفق المتزامن للرمز ونؤخر التنفيذ. يتم إجراء الاستدعاء الثاني إلى console.log () قبل استدعاء قائمة الانتظار داخل استدعاء setTimeout ().

ماذا عن PHP؟ في PHP ، ليس لدينا أدوات ملائمة مناسبة لكتابة رمز غير متزامن حقًا. لا يوجد ما يعادل setTimeout () ، ولا يمكننا ببساطة تأخير أو وضع أي قائمة انتظار في قائمة الانتظار. لهذا السبب بدأت الأطر والمكتبات مثل Amp و ReactPHP في الظهور. فكرتهم هي إخفاء تفاصيل اللغة منخفضة المستوى ومنح المستخدم أدوات عالية المستوى تتيح لك كتابة التعليمات البرمجية غير المتزامنة والتحكم في التنفيذ التنافسي لعمليات مثل JavaScript و Node.js.

لماذا يجب علي استخدام PHP إذا كان هناك Node.js و Go؟


غالبًا ما يطرح هذا السؤال عندما يتعلق الأمر بـ PHP غير المتزامن. لسبب ما ، يعارض الكثيرون استخدام PHP لكتابة كود غير متزامن. يقترح شخص ما دائمًا استخدام Go أو Node.js. بدلاً من PHP.

تصف تغريدة assertchris هذه الحالات تمامًا:

صورة

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

نعم ، يمكنك استخدام Go أو Node.js لإنشاء تطبيقات خادم غير متزامن ، لكن هذا لا يحل المشكلة دائمًا. إذا كان لديك بالفعل خبرة واسعة مع PHP ، فسيكون من الأسهل بالنسبة لك أن تتعلم ببساطة المكتبات والأدوات المناسبة لحالتك بدلاً من تعلم لغة جديدة ونظام بيئي جديد. تتيح لك أدوات مثل ReactPHP أو Amp كتابة التعليمات البرمجية غير المتزامنة تمامًا كما تفعل في Node.js. تم تطوير هذه الأدوات تمامًا ولديها إصدارات مستقرة ، بحيث يمكنك استخدامها بأمان في الإنتاج.

ليس فقط CLI


لن أكتب محادثة أو خادم أو شيء من هذا القبيل. أريد فقط تسريع الموقع.

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

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

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

استنتاج


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

حسنًا ، نذكرك أيضًا بأن لدينا دائمًا الكثير من الوظائف الشاغرة للمطورين!

Source: https://habr.com/ru/post/ar448968/


All Articles