PHP स्क्रिप्ट के लिए एक साथ अनुरोध


85

यदि PHP इंजन पहले से ही सर्वर पर एक स्क्रिप्ट निष्पादित करने के बीच में है, तो उसी स्क्रिप्ट के अन्य एक साथ ब्राउज़र अनुरोधों का क्या होगा?

  • क्या अनुरोध पंक्तिबद्ध होंगे?
  • क्या उन्हें नजरअंदाज किया जाएगा?
  • क्या प्रत्येक अनुरोध का अपना स्क्रिप्ट उदाहरण होगा?
  • कोई और संभावना?

1
इस उत्तर को भी देखें: konrness.com/php5/how-to-prevent-blocking-php-requests
trante

जवाबों:


140

सर्वर, इसके कॉन्फ़िगरेशन पर निर्भर करता है, आम तौर पर एक ही समय में सैकड़ों अनुरोधों की सेवा कर सकता है - यदि अपाचे का उपयोग कर रहा है, तो MaxClientsकॉन्फ़िगरेशन विकल्प वह है:

MaxClientsनिर्देश एक साथ अनुरोध करता है कि परोसा जाएगा की संख्या पर सीमा निर्धारित करता है। सीमा
से अधिक किसी भी कनेक्शन के प्रयासों MaxClientsको सामान्य रूप से पंक्तिबद्ध किया जाएगा, जो कि ListenBacklog निर्देश के आधार पर एक संख्या तक है।
एक बार एक बच्चे की प्रक्रिया को एक अलग अनुरोध के अंत में मुक्त कर दिया जाता है, फिर कनेक्शन को सेवित किया जाएगा।


तथ्य यह है कि दो ग्राहक एक ही पृष्ठ का अनुरोध करते हैं, कोई समस्या नहीं है।

इसलिए :

क्या अनुरोध पंक्तिबद्ध होंगे?

नहीं ; सिवाय अगर :

  • कहीं न कहीं कुछ लॉक है - जो हो सकता है, उदाहरण के लिए, यदि दो अनुरोध एक ही क्लाइंट से आते हैं, और आप PHP में फ़ाइल-आधारित सत्र का उपयोग कर रहे हैं : जबकि एक स्क्रिप्ट निष्पादित हो रही है, सत्र "लॉक" है, जो इसका मतलब है कि सर्वर / क्लाइंट को तब तक इंतजार करना होगा जब तक कि पहला अनुरोध समाप्त नहीं हो जाता है (और फ़ाइल अनलॉक ) दूसरे उपयोगकर्ता के लिए सत्र खोलने के लिए फ़ाइल का उपयोग करने में सक्षम हो सकता है।
  • अनुरोध एक ही क्लाइंट और एक ही ब्राउज़र से आते हैं; अधिकांश ब्राउज़र इस मामले में अनुरोधों को कतार में रख देंगे, तब भी जब सर्वर-साइड कुछ भी इस व्यवहार का उत्पादन नहीं कर रहा हो।
  • MaxClientsवर्तमान में सक्रिय प्रक्रियाओं की तुलना में अधिक हैं - अपाचे के मैनुअल से बोली को पहले ही देखें।


क्या उन्हें नजरअंदाज किया जाएगा?

नहीं: इसका मतलब केवल एक ही उपयोगकर्ता एक ही समय में एक वेबसाइट का उपयोग कर सकता है; यह काफी अच्छा नहीं होगा, यह होगा?

यदि यह मामला था, तो मैं इस उत्तर को पोस्ट नहीं कर सकता था, यदि आप उसी समय F5 मारते हैं तो यह देखने के लिए कि क्या किसी ने उत्तर दिया है!
(खैर, एसओ PHP में नहीं है, लेकिन सिद्धांत समान हैं)


कोई और संभावना?

हां ^ ^


ओपी और टिप्पणी संपादित करने के बाद संपादित करें:

क्या प्रत्येक अनुरोध का अपना स्क्रिप्ट उदाहरण होगा?

" स्क्रिप्ट इंस्टेंस " जैसी कोई चीज नहीं है : बस रखो, क्या हो रहा है जहां स्क्रिप्ट के लिए अनुरोध किया जाता है:

  • वेबसर्वर अनुरोध को संभालने के लिए एक और प्रक्रिया की मांग करता है (अक्सर, प्रदर्शन कारणों से, उन कांटे अग्रिम में किए जाते हैं, लेकिन यह कुछ भी नहीं बदलता है)
  • प्रक्रिया डिस्क से PHP स्क्रिप्ट पढ़ती है
    • कई प्रक्रियाएं एक ही समय में कर सकती हैं : फ़ाइल रीडिंग पर कोई लॉकिंग नहीं है
    • फ़ाइल को मेमोरी में लोड किया गया है; प्रत्येक प्रक्रिया के लिए एक अलग मेमोरी ब्लॉक में
  • मेमोरी में पीएचपी फाइल opcodes के लिए " संकलित " है - फिर भी मेमोरी में
  • उन opcodes को निष्पादित किया जाता है - फिर भी मेमोरी के ब्लॉक से जो आपके अनुरोध का जवाब देने की प्रक्रिया से संबंधित है


वास्तव में, आपके पास दो उपयोगकर्ता एक ही PHP स्क्रिप्ट के लिए एक अनुरोध भेज सकते हैं (या PHP स्क्रिप्ट को अलग करने के लिए जिसमें सभी समान PHP फ़ाइल शामिल हैं) ; यह निश्चित रूप से कोई समस्या नहीं है, या मैंने जिस वेबसाइट पर काम किया है, उसमें से कोई भी काम नहीं करेगा!


यदि एक साथ कई अनुरोध एक ही php फ़ाइल तक पहुँच रहे हैं तो परिणाम क्या होगा। क्या अन्य अनुरोधों को लंबित रखा जाएगा या प्रत्येक अनुरोध का अपना स्क्रिप्ट उदाहरण होगा?
केविन बॉयड

3
"स्क्रिप्ट उदाहरण" जैसी कोई चीज नहीं है: प्रत्येक अनुरोध को एक अलग प्रक्रिया (या धागा) द्वारा संसाधित किया जाता है; स्क्रिप्ट मेमोरी / डिस्क से पढ़ी जाती हैं, लेकिन एक ही फाइल को एक ही समय में कई प्रक्रियाओं से बिना किसी समस्या के पढ़ा जा सकता है (कम से कम, "आधुनिक" ऑपरेटिंग सिस्टम - यानी विंडोज और लिनक्स दोनों पर)
पास्कल मार्टिन

यह एक उत्कृष्ट उत्तर है, जहां मैं PHP के बारे में अधिक जानकारी प्राप्त कर सकता हूं कि यह कैसे काम करता है? इसके लिए कोई अच्छी किताब?
केविन बॉयड

1
मुझे इस बारे में वास्तव में जानकारी नहीं है: मैं अनुमान लगा रहा हूं कि मैं मैनुअल से गुजर रहा हूं, नेट पर लेख पढ़ रहा हूं, यहां और वहां सवाल / जवाब और कई वर्षों से PHP के साथ काम करना सीखने का एक अच्छा तरीका है - लेकिन मैं कर सकता हूं ' t वास्तव में किसी भी पुस्तक की अनुशंसा करता है जो यह बताती है कि PHP कैसे काम करती है ;; "एक्सटेंडिंग और एंबेडिंग PHP" में कुछ informations हैं, लेकिन इसका विषय यह बताने के लिए नहीं है कि PHP कैसे काम करता है ;; शायद php.net/manual/en/internals2.php मदद कर सकता है?
पास्कल मार्टिन

पूर्णता! मेरी बहुत मदद की!
20

21

यदि 2 क्लाइंट एक ही समय में सर्वर को कॉल करते हैं, तो सर्वर संभवतः दोनों क्लाइंट को लगभग एक साथ जवाब देने में सक्षम है। यहाँ ग्राहक मुझे ब्राउज़र स्तर पर परिभाषित करते हैं।

कहने का मतलब यह है कि एक ही मशीन पर, यदि आप एक ही समय में एक ही वेबसाइट / पेज को लोड करने के लिए 2 ब्राउज़र का उपयोग कर रहे हैं, तो दोनों को एक ही समय में लोड किया जाना चाहिए।

हालाँकि जब हम PHP के बारे में बात कर रहे हैं, तो आपको सत्रों के बारे में विशेष नोट्स लेने की आवश्यकता है। यदि आपके पृष्ठ सत्र का उपयोग करते हैं, तो सर्वर एक समय में केवल एक पृष्ठ की सेवा करता है। ऐसा इसलिए है क्योंकि सत्र फ़ाइल तब तक लॉक रहेगी, जब तक कोई स्क्रिप्ट बाहर नहीं निकल जाती।

इस उदाहरण को देखें। 2 फाइलें एक ही सत्र उर्फ ​​एक ही ब्राउज़र एक ही उपयोगकर्ता से भरी हुई हैं।

      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() जब आप अब सत्र का उपयोग नहीं कर रहे हैं, विशेष रूप से कई iframes या AJAX का उपयोग कर एक वेबसाइट पर।


4

बस खुद इस में भाग गया। मूल रूप से आपको session_write_close()एकल उपयोगकर्ता लॉकिंग को रोकने के लिए कॉल करने की आवश्यकता है । सुनिश्चित करें कि एक बार फोन करने के बाद आप session_write_close()कोशिश न करें और किसी भी सत्र चर को संशोधित करें। एक बार जब आप इसे कॉल करते हैं, तब से केवल पढ़ने के लिए सत्रों का व्यवहार करें।


3

जब तक आप एक बहुत ही गैर-मानक सेटअप नहीं चला रहे हों, तो आपके वेब सर्वर (Apache, IIS, nginx, आदि) में कई प्रक्रियाएँ होंगी जो सर्वर में आने वाले प्रत्येक अनुरोध के लिए अलग से PHP चलाती हैं। एक साथ अनुरोधों को एक साथ सेवित किया जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.