ฉันเห็นไบนารีที่แตกต่างกันสำหรับ PHP เช่นไม่ใช่เธรดหรือเธรดที่ปลอดภัยหรือไม่
สิ่งนี้หมายความว่า?
ความแตกต่างระหว่างแพ็คเกจเหล่านี้คืออะไร?
ฉันเห็นไบนารีที่แตกต่างกันสำหรับ PHP เช่นไม่ใช่เธรดหรือเธรดที่ปลอดภัยหรือไม่
สิ่งนี้หมายความว่า?
ความแตกต่างระหว่างแพ็คเกจเหล่านี้คืออะไร?
คำตอบ:
เว็บเซิร์ฟเวอร์ต่าง ๆ ใช้เทคนิคที่แตกต่างกันในการจัดการคำขอ HTTP ขาเข้าพร้อมกัน เทคนิคที่นิยมใช้กันมากคือการใช้เธรดนั่นคือเว็บเซิร์ฟเวอร์จะสร้าง / อุทิศเธรดเดียวสำหรับแต่ละคำขอที่เข้ามา เว็บเซิร์ฟเวอร์ Apache HTTP รองรับหลายรุ่นสำหรับจัดการคำขอซึ่งหนึ่งในนั้น (เรียกว่า MPM ของผู้ปฏิบัติงาน) ใช้เธรด แต่รองรับรูปแบบการทำงานพร้อมกันอื่นที่เรียกว่า prefork MPM ซึ่งใช้กระบวนการ - นั่นคือเว็บเซิร์ฟเวอร์จะสร้าง / อุทิศกระบวนการเดียวสำหรับแต่ละคำขอ
นอกจากนี้ยังมีโมเดลการทำงานพร้อมกันอื่น ๆ ที่แตกต่างกันโดยสิ้นเชิง (ใช้ Asynchronous sockets และ I / O) รวมถึงรุ่นที่ผสมสองหรือสามรุ่นเข้าด้วยกัน เพื่อจุดประสงค์ในการตอบคำถามนี้เรามีความกังวลเฉพาะกับสองรุ่นด้านบนเท่านั้นและใช้เป็นตัวอย่างเซิร์ฟเวอร์ Apache HTTP
PHP เองไม่ตอบสนองต่อคำขอ HTTP จริง - นี่เป็นหน้าที่ของเว็บเซิร์ฟเวอร์ ดังนั้นเรากำหนดค่าเว็บเซิร์ฟเวอร์เพื่อส่งต่อการร้องขอไปยัง PHP เพื่อการประมวลผลจากนั้นรับผลและส่งกลับไปยังผู้ใช้ มีหลายวิธีในการเชื่อมโยงเว็บเซิร์ฟเวอร์กับ PHP สำหรับ Apache HTTP Server ความนิยมมากที่สุดคือ "mod_php" โมดูลนี้เป็น PHP จริง ๆ แต่คอมไพล์เป็นโมดูลสำหรับเว็บเซิร์ฟเวอร์และดังนั้นมันจึงถูกโหลดภายใน
มีวิธีอื่นในการผูกมัด PHP กับ Apache และเว็บเซิร์ฟเวอร์อื่น ๆ แต่ mod_php เป็นวิธีที่ได้รับความนิยมมากที่สุดและจะตอบคำถามของคุณด้วย
คุณอาจไม่จำเป็นต้องเข้าใจรายละเอียดเหล่านี้มาก่อนเพราะ บริษัท โฮสติ้งและ GNU / Linux distros มาพร้อมกับทุกอย่างที่เราเตรียมไว้
เนื่องจาก mod_php ทำให้ PHP โหลดลงใน Apache ได้ทันทีหาก Apache กำลังจัดการการใช้งานพร้อมกันโดยใช้ Worker MPM (นั่นคือใช้ Threads) ดังนั้น PHP จะต้องสามารถทำงานในสภาพแวดล้อมแบบมัลติเธรดเดียวกันได้ซึ่งหมายความว่าPHP ต้อง ปลอดภัยในการเล่นลูกบอลอย่างถูกต้องกับ Apache!
ณ จุดนี้คุณควรจะคิดว่า "ตกลงดังนั้นถ้าฉันใช้เว็บเซิร์ฟเวอร์แบบมัลติเธรดและฉันจะฝัง PHP ลงไปในนั้นแล้วฉันจะต้องใช้ PHP รุ่น thread-safe" และนี่จะเป็นการคิดที่ถูกต้อง อย่างไรก็ตามในขณะที่มันเกิดขึ้นด้ายความปลอดภัยของ PHP ไม่แน่นอนสูง มันเป็นพื้นดินที่ใช้งานได้จริงถ้าคุณรู้จริงๆว่าคุณกำลังทำอะไรอยู่
ในกรณีที่คุณสงสัยคำแนะนำส่วนตัวของฉันจะไม่ใช้ PHP ในสภาพแวดล้อมแบบมัลติเธรดถ้าคุณมีทางเลือก!
พูดถึงสภาพแวดล้อมที่ใช้ Unix เท่านั้นฉันโชคดีที่คุณต้องคิดถึงสิ่งนี้หากคุณจะใช้ PHP กับ Apache เว็บเซิร์ฟเวอร์ซึ่งในกรณีนี้คุณควรไปกับ MPM prefork ของ Apache (ซึ่งก็คือ ไม่ได้ใช้เธรดดังนั้นความปลอดภัยของเธรด PHP จึงไม่สำคัญ) และการแจกแจง GNU / Linux ทั้งหมดที่ฉันรู้จะให้คุณตัดสินใจเมื่อคุณติดตั้ง Apache + PHP ผ่านระบบแพ็คเกจโดยไม่ต้องแจ้งให้คุณทราบ สำหรับทางเลือก หากคุณจะใช้เว็บเซิร์ฟเวอร์อื่น ๆ เช่นnginxหรือlighttpdคุณจะไม่มีตัวเลือกในการฝัง PHP ลงไป คุณจะมองการใช้FastCGIหรือสิ่งที่เท่าเทียมกันซึ่งทำงานในรูปแบบที่แตกต่างกันซึ่ง PHP อยู่ข้างนอกทั้งหมดของเว็บเซิร์ฟเวอร์ที่มีกระบวนการ PHP หลายขั้นตอนที่ใช้สำหรับการตอบคำขอผ่าน FastCGI สำหรับกรณีดังกล่าวความปลอดภัยของเธรดก็ไม่สำคัญเช่นกัน หากต้องการดูว่าเว็บไซต์ของคุณใช้งานเวอร์ชันใดอยู่ให้วางไฟล์ที่มี<?php phpinfo(); ?>
อยู่ในเว็บไซต์ของคุณและค้นหาServer API
รายการ นี้อาจจะบอกว่าสิ่งที่ต้องการหรือCGI/FastCGI
Apache 2.0 Handler
หากคุณดูที่ PHP เวอร์ชันบรรทัดคำสั่ง - ความปลอดภัยของเธรดไม่สำคัญ
ในที่สุดหากความปลอดภัยของเธรดไม่สำคัญดังนั้นคุณควรใช้เวอร์ชันใด - เธรดที่ปลอดภัยหรือไม่ที่ปลอดภัยต่อเธรด? ตรงไปตรงมาฉันไม่มีคำตอบทางวิทยาศาสตร์! แต่ฉันเดาว่าเวอร์ชั่นที่ไม่ปลอดภัยสำหรับเธรดนั้นเร็วกว่าและ / หรือมีความผิดพลาดน้อยลงมิฉะนั้นพวกเขาจะเสนอเวอร์ชั่นที่ปลอดภัยสำหรับเธรดและไม่ใส่ใจที่จะให้ทางเลือกแก่เรา!
สำหรับฉันฉันมักจะเลือกรุ่นที่ไม่ใช้เธรดอย่างปลอดภัยเพราะฉันใช้ nginx เสมอหรือเรียกใช้ PHP จากบรรทัดคำสั่ง
ควรใช้เวอร์ชันที่ไม่ใช่เธรดที่ปลอดภัยถ้าคุณติดตั้ง PHP เป็นไบนารี CGI, อินเตอร์เฟสบรรทัดคำสั่งหรือสภาพแวดล้อมอื่น ๆ ที่ใช้เพียงเธรดเดียวเท่านั้น
ควรใช้เวอร์ชันแบบเธรดที่ปลอดภัยถ้าคุณติดตั้ง PHP เป็นโมดูล Apache ใน MPM ของผู้ปฏิบัติงาน (รูปแบบการประมวลผลหลายแบบ) หรือสภาพแวดล้อมอื่น ๆ ที่หัวข้อ PHP หลายเธรดทำงานพร้อมกัน
Apache MPM prefork พร้อม modphp ถูกใช้เพราะง่ายต่อการกำหนดค่า / ติดตั้ง ประสิทธิภาพการทำงานที่ชาญฉลาดมันค่อนข้างไม่มีประสิทธิภาพ วิธีที่ฉันชอบในการทำ FastCGI / PHP-FPM ด้วยวิธีนี้คุณสามารถใช้ MPM Worker ที่เร็วขึ้น PHP ทั้งหมดยังคงไม่มีเธรด แต่ Apache ให้บริการแบบเธรด (อย่างที่ควร)
ดังนั้นโดยทั่วไปจากล่างขึ้นบน
ลินุกซ์
Apache + MPM Worker + ModFastCGI (ไม่ใช่ FCGI) | (หรือ) | Cherokee | (หรือ) | Nginx
PHP-FPM + APC
ModFCGI ไม่รองรับ PHP-FPM หรือแอปพลิเคชัน FastCGI ภายนอกใด ๆ อย่างถูกต้อง สนับสนุนสคริปต์ FastCGI ที่ไม่ได้จัดการเท่านั้น PHP-FPM เป็นผู้จัดการกระบวนการ PHP FastCGI
เป็นต่อPHP เอกสาร ,
ความปลอดภัยของเธรดหมายความว่าไบนารีสามารถทำงานในบริบทเว็บเซิร์ฟเวอร์แบบมัลติเธรดเช่น Apache 2 บน Windows ความปลอดภัยของเธรดทำงานโดยการสร้างสำเนาที่เก็บข้อมูลภายในในแต่ละเธรดเพื่อที่ว่าข้อมูลจะไม่ชนกับเธรดอื่น
แล้วฉันจะเลือกอะไร หากคุณเลือกที่จะรัน PHP เป็นไบนารี CGI คุณจะไม่ต้องใช้ความปลอดภัยของเธรดเนื่องจากมีการเรียกใช้ไบนารีในแต่ละคำขอ สำหรับ webservers แบบมัลติเธรดเช่น IIS5 และ IIS6 คุณควรใช้ PHP เวอร์ชันเธรด
ไลบรารี่ต่อไปนี้ไม่ปลอดภัยสำหรับเธรด ไม่แนะนำให้ใช้ในสภาพแวดล้อมแบบมัลติเธรด