سؤال

إذا كان محرك PHP في منتصف تنفيذ البرنامج النصي على الخادم، فماذا سيحدث لطلبات المتصفح المتزامنة الأخرى لنفس البرنامج النصي؟

  • هل ستظل الطلبات في قائمة الانتظار؟
  • هل سيتم تجاهلهم؟
  • هل سيكون لكل طلب مثيل البرنامج النصي الخاص به؟
  • أي احتمال آخر؟
هل كانت مفيدة؟

المحلول

يمكن للخادم، اعتمادًا على تكوينه، أن يخدم بشكل عام مئات الطلبات في نفس الوقت - في حالة استخدام Apache، فإن MaxClients خيار التكوين هو الذي يقول:

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


حقيقة أن عميلين يطلبان نفس الصفحة ليست مشكلة.

لذا :

هل ستظل الطلبات في قائمة الانتظار؟

لا ؛إلا إذا:

  • هناك بعض قفل في مكان ما - وهو ما يمكن أن يحدث، على سبيل المثال، إذا جاء الطلبان من نفس العميل، وكنت تستخدمه الجلسات المستندة إلى الملفات في PHP :أثناء تنفيذ البرنامج النصي، تكون الجلسة "مقفلة"، مما يعني أنه سيتعين على الخادم/العميل الانتظار حتى انتهاء الطلب الأول (وفتح الملف) لتتمكن من استخدام الملف لفتح الجلسة للمستخدم الثاني.
  • تأتي الطلبات من نفس العميل ونفس المتصفح؛ستقوم معظم المتصفحات بوضع الطلبات في قائمة الانتظار في هذه الحالة، حتى في حالة عدم وجود أي شيء من جانب الخادم ينتج هذا السلوك.
  • هناك اكثر من MaxClients العمليات النشطة حاليًا - راجع الاقتباس من دليل Apache قبل قليل.


هل سيتم تجاهلهم؟

لا :وهذا يعني أن مستخدمًا واحدًا فقط يمكنه استخدام موقع الويب في نفس الوقت؛لن يكون هذا لطيفًا تمامًا، أليس كذلك؟

إذا كان الأمر كذلك، فلن أتمكن من نشر هذه الإجابة، إذا قمت بالضغط على F5 في نفس اللحظة لمعرفة ما إذا كان شخص ما قد أجاب!
(حسنًا، SO ليس موجودًا في PHP، لكن المبادئ هي نفسها)


أي احتمال آخر؟

نعم ^^


قم بالتحرير بعد تحرير OP والتعليق:

هل سيكون لكل طلب نصه الخاص مثيل؟

ليس هناك شيء مثل "مثيل البرنامج النصي" :ببساطة، ما يحدث عند تقديم طلب لبرنامج نصي هو:

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


في الواقع، يمكن أن يكون لديك مستخدمين يرسلان طلبًا إلى نفس البرنامج النصي PHP (أو لبرامج PHP النصية المميزة التي تتضمن جميعها نفس ملف PHP) ;هذه ليست مشكلة بالتأكيد، وإلا فلن يعمل أي موقع من مواقع الويب التي عملت عليها!

نصائح أخرى

إذا قام عميلان بالاتصال بالخادم في نفس الوقت، فمن المرجح أن يتمكن الخادم من الرد على كلا العميلين في وقت واحد تقريبًا.العملاء هنا أقوم بتعريفهم على مستوى المتصفح.

وهذا يعني أنه على نفس الجهاز، إذا كنت تستخدم متصفحين لتحميل نفس موقع الويب/الصفحة في نفس الوقت، فيجب تحميل كلاهما في نفس الوقت.

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

انظر إلى هذا المثال.يتم تحميل الملفين من نفس الجلسة ويعرف أيضًا باسم نفس المتصفح ونفس المستخدم.

      scripta.php requested                 scripta.php served
------+---+---------------------------------+------------------------>
          scripta.php started

               scriptb.php requested           scriptb.php started
---------------+-------------------------------+-----------------+--->
                                                                 scriptb.php served.

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

ستستمر هذه العملية في التكرار لمنع كتابة نصوص برمجية متعددة إلى ملف الجلسة نفسه مما يتسبب في حدوث تأخيرات.لذلك ينصح بالاتصال session_write_close() عندما لا تعود تستخدم الجلسة، خاصة على موقع ويب يستخدم العديد من إطارات iframe أو AJAX.

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top