หาก PHP Engine อยู่ระหว่างเรียกใช้สคริปต์บนเซิร์ฟเวอร์แล้วจะเกิดอะไรขึ้นกับการร้องขอเบราว์เซอร์อื่น ๆ พร้อมกันไปยังสคริปต์เดียวกัน
- คำขอจะถูกจัดคิวหรือไม่
- พวกเขาจะถูกละเลยหรือไม่?
- แต่ละคำขอจะมีอินสแตนซ์สคริปต์ของตัวเองหรือไม่
- ความเป็นไปได้อื่น ๆ ?
หาก PHP Engine อยู่ระหว่างเรียกใช้สคริปต์บนเซิร์ฟเวอร์แล้วจะเกิดอะไรขึ้นกับการร้องขอเบราว์เซอร์อื่น ๆ พร้อมกันไปยังสคริปต์เดียวกัน
คำตอบ:
เซิร์ฟเวอร์ขึ้นอยู่กับการกำหนดค่าโดยทั่วไปสามารถให้บริการคำขอได้หลายร้อยรายการในเวลาเดียวกัน - หากใช้ Apache MaxClients
ตัวเลือกการกำหนดค่าจะเป็นตัวเลือกที่กล่าวว่า:
MaxClients
สั่งกำหนดขีด จำกัด เกี่ยวกับจำนวนของการร้องขอพร้อมกันที่จะทำหน้าที่ โดยปกติ
การเชื่อมต่อใด ๆ ที่พยายามเกินMaxClients
ขีด จำกัด จะถูกจัดคิวโดยขึ้นอยู่กับจำนวนตามคำสั่ง ListenBacklog
เมื่อกระบวนการย่อยได้รับการปลดปล่อยในตอนท้ายของการร้องขออื่นการเชื่อมต่อจะได้รับการบริการ
ความจริงที่ว่าลูกค้าสองคนขอเพจเดียวกันไม่ใช่ปัญหา
ดังนั้น:
คำขอจะถูกจัดคิวหรือไม่
ไม่; ยกเว้นถ้า:
MaxClients
กระบวนการที่ใช้งานอยู่ในปัจจุบันมากกว่า- ดูคำพูดจากคู่มือของ Apache ก่อนหน้านี้พวกเขาจะถูกละเลยหรือไม่?
ไม่: นี่หมายความว่ามีผู้ใช้เพียงคนเดียวเท่านั้นที่สามารถใช้เว็บไซต์ได้ในเวลาเดียวกัน มันคงไม่ดีนักใช่ไหม
หากเป็นเช่นนั้นฉันไม่สามารถโพสต์คำตอบนี้ได้หากคุณกดปุ่ม F5 ในขณะเดียวกันเพื่อดูว่ามีคนตอบหรือไม่!
(ดี SO ไม่ได้อยู่ใน PHP แต่หลักการเหมือนกัน)
ความเป็นไปได้อื่น ๆ ?
ครับ ^^
แก้ไขหลังจากที่คุณแก้ไข OP และความคิดเห็น:
แต่ละคำขอจะมีอินสแตนซ์สคริปต์ของตัวเองหรือไม่
ไม่มีสิ่งที่เรียกว่า " อินสแตนซ์สคริปต์ " กล่าวง่ายๆว่าสิ่งที่เกิดขึ้นเมื่อมีการร้องขอไปยังสคริปต์คือ:
จริงๆคุณสามารถมีสองผู้ใช้ส่งคำขอไปยังสคริปต์ PHP เดียวกัน(หรือสคริปต์ PHP ที่แตกต่างกันว่าทั้งหมดรวมถึงไฟล์ PHP เดียวกัน) ; นั่นไม่ใช่ปัญหาอย่างแน่นอนหรือไม่มีเว็บไซต์ใดที่ฉันเคยทำงานอยู่เลย!
หากไคลเอนต์ 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 จำนวนมาก
เพิ่งเจอเรื่องนี้เอง โดยทั่วไปคุณต้องโทรsession_write_close()
เพื่อป้องกันการล็อกผู้ใช้คนเดียว ตรวจสอบให้แน่ใจว่าเมื่อคุณโทรไปแล้วsession_write_close()
คุณไม่ได้พยายามแก้ไขตัวแปรเซสชันใด ๆ เมื่อคุณเรียกมันแล้วให้ถือว่าเซสชันเป็นแบบอ่านอย่างเดียวนับจากนั้นเป็นต้นไป
เว้นแต่คุณจะใช้การตั้งค่าเว็บเซิร์ฟเวอร์ที่ไม่ได้มาตรฐาน (Apache, IIS, nginx และอื่น ๆ ) จะมีหลายกระบวนการที่เรียกใช้ PHP แยกกันสำหรับแต่ละคำขอที่เข้ามาในเซิร์ฟเวอร์ การร้องขอพร้อมกันจะได้รับการบริการพร้อมกัน