การร้องขอไปยัง PHP Script พร้อมกัน


86

หาก PHP Engine อยู่ระหว่างเรียกใช้สคริปต์บนเซิร์ฟเวอร์แล้วจะเกิดอะไรขึ้นกับการร้องขอเบราว์เซอร์อื่น ๆ พร้อมกันไปยังสคริปต์เดียวกัน

  • คำขอจะถูกจัดคิวหรือไม่
  • พวกเขาจะถูกละเลยหรือไม่?
  • แต่ละคำขอจะมีอินสแตนซ์สคริปต์ของตัวเองหรือไม่
  • ความเป็นไปได้อื่น ๆ ?

1
ตรวจสอบคำตอบนี้ด้วย: konrness.com/php5/how-to-prevent-blocking-php-requests
trante

คำตอบ:


141

เซิร์ฟเวอร์ขึ้นอยู่กับการกำหนดค่าโดยทั่วไปสามารถให้บริการคำขอได้หลายร้อยรายการในเวลาเดียวกัน - หากใช้ Apache MaxClientsตัวเลือกการกำหนดค่าจะเป็นตัวเลือกที่กล่าวว่า:

MaxClientsสั่งกำหนดขีด จำกัด เกี่ยวกับจำนวนของการร้องขอพร้อมกันที่จะทำหน้าที่ โดยปกติ
การเชื่อมต่อใด ๆ ที่พยายามเกิน MaxClientsขีด จำกัด จะถูกจัดคิวโดยขึ้นอยู่กับจำนวนตามคำสั่ง ListenBacklog
เมื่อกระบวนการย่อยได้รับการปลดปล่อยในตอนท้ายของการร้องขออื่นการเชื่อมต่อจะได้รับการบริการ


ความจริงที่ว่าลูกค้าสองคนขอเพจเดียวกันไม่ใช่ปัญหา

ดังนั้น:

คำขอจะถูกจัดคิวหรือไม่

ไม่; ยกเว้นถ้า:

  • มีการล็อกบางอย่างซึ่งอาจเกิดขึ้นได้ตัวอย่างเช่นหากคำขอทั้งสองมาจากไคลเอนต์เดียวกันและคุณกำลังใช้เซสชันที่ใช้ไฟล์ใน PHP : ในขณะที่สคริปต์กำลังดำเนินการเซสชันจะถูก "ล็อก" ซึ่ง หมายความว่าเซิร์ฟเวอร์ / ไคลเอนต์จะต้องรอจนกว่าคำขอแรกจะเสร็จสิ้น(และไฟล์ถูกปลดล็อก ) จึงจะสามารถใช้ไฟล์เพื่อเปิดเซสชันสำหรับผู้ใช้คนที่สองได้
  • คำขอมาจากไคลเอนต์เดียวกันและเบราว์เซอร์เดียวกัน เบราว์เซอร์ส่วนใหญ่จะจัดคิวคำขอในกรณีนี้แม้ว่าจะไม่มีสิ่งใดที่ฝั่งเซิร์ฟเวอร์สร้างพฤติกรรมนี้ก็ตาม
  • มีMaxClientsกระบวนการที่ใช้งานอยู่ในปัจจุบันมากกว่า- ดูคำพูดจากคู่มือของ Apache ก่อนหน้านี้


พวกเขาจะถูกละเลยหรือไม่?

ไม่: นี่หมายความว่ามีผู้ใช้เพียงคนเดียวเท่านั้นที่สามารถใช้เว็บไซต์ได้ในเวลาเดียวกัน มันคงไม่ดีนักใช่ไหม

หากเป็นเช่นนั้นฉันไม่สามารถโพสต์คำตอบนี้ได้หากคุณกดปุ่ม F5 ในขณะเดียวกันเพื่อดูว่ามีคนตอบหรือไม่!
(ดี SO ไม่ได้อยู่ใน PHP แต่หลักการเหมือนกัน)


ความเป็นไปได้อื่น ๆ ?

ครับ ^^


แก้ไขหลังจากที่คุณแก้ไข OP และความคิดเห็น:

แต่ละคำขอจะมีอินสแตนซ์สคริปต์ของตัวเองหรือไม่

ไม่มีสิ่งที่เรียกว่า " อินสแตนซ์สคริปต์ " กล่าวง่ายๆว่าสิ่งที่เกิดขึ้นเมื่อมีการร้องขอไปยังสคริปต์คือ:

  • เว็บเซิร์ฟเวอร์แยกกระบวนการอื่นเพื่อจัดการคำขอ(บ่อยครั้งด้วยเหตุผลด้านประสิทธิภาพส้อมเหล่านั้นจะถูกจัดทำไว้ล่วงหน้า แต่จะไม่มีอะไรเปลี่ยนแปลง)
  • กระบวนการอ่านสคริปต์ PHP จากดิสก์
    • หลายกระบวนการสามารถทำได้ในเวลาเดียวกัน : ไม่มีการล็อกการอ่านไฟล์
    • ไฟล์ถูกโหลดลงในหน่วยความจำ ในบล็อกหน่วยความจำที่แตกต่างกันสำหรับแต่ละกระบวนการ
  • ไฟล์ PHP ในหน่วยความจำถูก " คอมไพล์ " เป็น opcodes - ยังอยู่ในหน่วยความจำ
  • opcodes เหล่านั้นจะถูกดำเนินการ - ยังคงมาจากบล็อกของหน่วยความจำที่เป็นของกระบวนการตอบสนองคำขอของคุณ


จริงๆคุณสามารถมีสองผู้ใช้ส่งคำขอไปยังสคริปต์ PHP เดียวกัน(หรือสคริปต์ PHP ที่แตกต่างกันว่าทั้งหมดรวมถึงไฟล์ PHP เดียวกัน) ; นั่นไม่ใช่ปัญหาอย่างแน่นอนหรือไม่มีเว็บไซต์ใดที่ฉันเคยทำงานอยู่เลย!


หากคำขอพร้อมกันหลายรายการเข้าถึงไฟล์ php เดียวกันผลลัพธ์จะเป็นอย่างไร คำขออื่น ๆ จะถูกเก็บไว้รอดำเนินการหรือแต่ละคำขอจะมีอินสแตนซ์สคริปต์ของตัวเอง?
Kevin Boyd

3
ไม่มีสิ่งที่เรียกว่า "script instance": แต่ละคำขอจะถูกประมวลผลโดยกระบวนการที่แตกต่างกัน (หรือเธรด) ;; สคริปต์จะอ่านจากหน่วยความจำ / ดิสก์ แต่ไฟล์เดียวกันสามารถอ่านได้จากหลายกระบวนการในเวลาเดียวกันโดยไม่มีปัญหา (อย่างน้อยก็ในระบบปฏิบัติการ "สมัยใหม่" เช่นทั้ง Windows และ Linux)
Pascal MARTIN

นี่เป็นคำตอบที่ยอดเยี่ยมฉันจะเรียนรู้รายละเอียดเพิ่มเติมเกี่ยวกับการทำงานของ PHP ได้ที่ไหน หนังสือเล่มนี้ดีไหม
Kevin Boyd

1
ฉันไม่รู้จริงๆ: ฉันเดาว่ากำลังอ่านคู่มือการอ่านบทความบนเน็ตคำถาม / คำตอบที่นี่และที่นั่นและการทำงานกับ PHP เป็นเวลาหลายปีเป็นวิธีที่ดีในการเรียนรู้ - แต่ฉันทำได้ ' แนะนำหนังสือที่จะอธิบายว่า PHP ทำงานอย่างไร ;; มีข้อมูลบางอย่างใน "การขยายและการฝัง PHP" แต่หัวข้อนี้ไม่ได้อธิบายถึงวิธีการทำงานของ PHP ;; บางทีphp.net/manual/en/internals2.phpสามารถช่วยเหลือหรือไม่
Pascal MARTIN

สมบูรณ์แบบ! ช่วยฉันได้มาก!
zookastos

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() เมื่อคุณไม่ได้ใช้เซสชันอีกต่อไปโดยเฉพาะบนเว็บไซต์ที่ใช้ iframe หรือ AJAX จำนวนมาก


4

เพิ่งเจอเรื่องนี้เอง โดยทั่วไปคุณต้องโทรsession_write_close()เพื่อป้องกันการล็อกผู้ใช้คนเดียว ตรวจสอบให้แน่ใจว่าเมื่อคุณโทรไปแล้วsession_write_close()คุณไม่ได้พยายามแก้ไขตัวแปรเซสชันใด ๆ เมื่อคุณเรียกมันแล้วให้ถือว่าเซสชันเป็นแบบอ่านอย่างเดียวนับจากนั้นเป็นต้นไป


3

เว้นแต่คุณจะใช้การตั้งค่าเว็บเซิร์ฟเวอร์ที่ไม่ได้มาตรฐาน (Apache, IIS, nginx และอื่น ๆ ) จะมีหลายกระบวนการที่เรียกใช้ PHP แยกกันสำหรับแต่ละคำขอที่เข้ามาในเซิร์ฟเวอร์ การร้องขอพร้อมกันจะได้รับการบริการพร้อมกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.