เธรดปลอดภัยหรือไม่ปลอดภัยเธรดใน PHP คืออะไร


773

ฉันเห็นไบนารีที่แตกต่างกันสำหรับ PHP เช่นไม่ใช่เธรดหรือเธรดที่ปลอดภัยหรือไม่

สิ่งนี้หมายความว่า?

ความแตกต่างระหว่างแพ็คเกจเหล่านี้คืออะไร?


18
คุณสามารถอ่านเกี่ยวกับหัวข้อความปลอดภัยในen.wikipedia.org/wiki/Thread_safetyเกี่ยวกับ PHP: Is PHP ด้ายปลอดภัย ไม่เชื่อว่าโกหก: PHP ไม่ด้ายปลอดภัย แต่ ความแตกต่างระหว่างความปลอดภัยด้าย PHP และด้ายที่ไม่ใช่ binarie ปลอดภัยมี มีทรัพยากรมากมาย ค้นหาที่นี่ที่ Stackoverflow หรือ Google
TigerTiger

คำตอบ:


668

พื้นหลังที่จำเป็นในแนวทางการทำงานพร้อมกัน:

เว็บเซิร์ฟเวอร์ต่าง ๆ ใช้เทคนิคที่แตกต่างกันในการจัดการคำขอ HTTP ขาเข้าพร้อมกัน เทคนิคที่นิยมใช้กันมากคือการใช้เธรดนั่นคือเว็บเซิร์ฟเวอร์จะสร้าง / อุทิศเธรดเดียวสำหรับแต่ละคำขอที่เข้ามา เว็บเซิร์ฟเวอร์ Apache HTTP รองรับหลายรุ่นสำหรับจัดการคำขอซึ่งหนึ่งในนั้น (เรียกว่า MPM ของผู้ปฏิบัติงาน) ใช้เธรด แต่รองรับรูปแบบการทำงานพร้อมกันอื่นที่เรียกว่า prefork MPM ซึ่งใช้กระบวนการ - นั่นคือเว็บเซิร์ฟเวอร์จะสร้าง / อุทิศกระบวนการเดียวสำหรับแต่ละคำขอ

นอกจากนี้ยังมีโมเดลการทำงานพร้อมกันอื่น ๆ ที่แตกต่างกันโดยสิ้นเชิง (ใช้ Asynchronous sockets และ I / O) รวมถึงรุ่นที่ผสมสองหรือสามรุ่นเข้าด้วยกัน เพื่อจุดประสงค์ในการตอบคำถามนี้เรามีความกังวลเฉพาะกับสองรุ่นด้านบนเท่านั้นและใช้เป็นตัวอย่างเซิร์ฟเวอร์ Apache HTTP

พื้นหลังที่จำเป็นเกี่ยวกับวิธีที่ PHP "รวม" กับเว็บเซิร์ฟเวอร์:

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/FastCGIApache 2.0 Handler

หากคุณดูที่ PHP เวอร์ชันบรรทัดคำสั่ง - ความปลอดภัยของเธรดไม่สำคัญ

ในที่สุดหากความปลอดภัยของเธรดไม่สำคัญดังนั้นคุณควรใช้เวอร์ชันใด - เธรดที่ปลอดภัยหรือไม่ที่ปลอดภัยต่อเธรด? ตรงไปตรงมาฉันไม่มีคำตอบทางวิทยาศาสตร์! แต่ฉันเดาว่าเวอร์ชั่นที่ไม่ปลอดภัยสำหรับเธรดนั้นเร็วกว่าและ / หรือมีความผิดพลาดน้อยลงมิฉะนั้นพวกเขาจะเสนอเวอร์ชั่นที่ปลอดภัยสำหรับเธรดและไม่ใส่ใจที่จะให้ทางเลือกแก่เรา!


2
PHP-FPM ไม่ได้เป็นเธรดหรือไม่ ที่แก้ปัญหาแล้วตั้งแต่ Fast CGI ถูกใช้บนเซิร์ฟเวอร์ nginx
Xeoncross

41
รายละเอียดยอดเยี่ยมฉันได้เขียนโปรแกรมใน PHP มาหลายปีแล้วและไม่เคยรู้เรื่องนี้มาก่อน
แพทริค

1
@ Xeoncross: โดยทั่วไปแล้วถูกต้องและในทางปฏิบัติมันเป็นหนึ่งในเหตุผลที่ดีในการจัดการกระบวนการ PHP นอก Apache ฉันตอบคำถามนี้
JM Becker

ปัญหาเดียวที่นี่คือ PHP-FPM ไม่สามารถใช้งานได้กับ Windows อย่างน้อยก็เป็นงานสร้างพื้นเมือง
เดนิส V

9
ความปลอดภัยของเธรด PHP ยังคงเป็น "โต้แย้งอย่างมาก" (ในปี 2015 และเวอร์ชัน 7) หรือไม่
Altiano Gerung

261

สำหรับฉันฉันมักจะเลือกรุ่นที่ไม่ใช้เธรดอย่างปลอดภัยเพราะฉันใช้ nginx เสมอหรือเรียกใช้ PHP จากบรรทัดคำสั่ง

ควรใช้เวอร์ชันที่ไม่ใช่เธรดที่ปลอดภัยถ้าคุณติดตั้ง PHP เป็นไบนารี CGI, อินเตอร์เฟสบรรทัดคำสั่งหรือสภาพแวดล้อมอื่น ๆ ที่ใช้เพียงเธรดเดียวเท่านั้น

ควรใช้เวอร์ชันแบบเธรดที่ปลอดภัยถ้าคุณติดตั้ง PHP เป็นโมดูล Apache ใน MPM ของผู้ปฏิบัติงาน (รูปแบบการประมวลผลหลายแบบ) หรือสภาพแวดล้อมอื่น ๆ ที่หัวข้อ PHP หลายเธรดทำงานพร้อมกัน


1
คำตอบของคุณควรเป็นอย่างดี: "ควรใช้เวอร์ชั่นของเธรดเซฟถ้าคุณต้องการติดตั้ง PHP เป็นโมดูล Apache โดยที่ผู้ปฏิบัติงานเป็น MPM"
wlf

9
ดังนั้น php ที่มาพร้อมกับ xampp บน windows คือ NTS หรือ TS?
Abudayah

1
ถ้าคุณใช้ PHP เว็บเซิร์ฟเวอร์ในตัวล่ะ? PHP ชนิดใดที่จะใช้เพื่อประสิทธิภาพที่ดีที่สุด
Ariod

1
@Dario ฉันคิดว่าเป็นเพียง Windows
Greg

1
@ChristopherShaw เพื่อนคำตอบที่มีความคิดเห็นเท่านั้น ไม่มีแหล่งที่มาหรือเหตุผลทำไมต้องใช้ ZTS ร่วมกับโมดูล Apache มันไม่ใช่คำตอบที่ถูกต้อง แม้แต่ 217 ppl ก็ผิด m8
Daniel W.

30

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


21

เป็นต่อPHP เอกสาร ,

ความปลอดภัยของเธรดหมายความว่าอย่างไรเมื่อดาวน์โหลด PHP

ความปลอดภัยของเธรดหมายความว่าไบนารีสามารถทำงานในบริบทเว็บเซิร์ฟเวอร์แบบมัลติเธรดเช่น Apache 2 บน Windows ความปลอดภัยของเธรดทำงานโดยการสร้างสำเนาที่เก็บข้อมูลภายในในแต่ละเธรดเพื่อที่ว่าข้อมูลจะไม่ชนกับเธรดอื่น

แล้วฉันจะเลือกอะไร หากคุณเลือกที่จะรัน PHP เป็นไบนารี CGI คุณจะไม่ต้องใช้ความปลอดภัยของเธรดเนื่องจากมีการเรียกใช้ไบนารีในแต่ละคำขอ สำหรับ webservers แบบมัลติเธรดเช่น IIS5 และ IIS6 คุณควรใช้ PHP เวอร์ชันเธรด

ไลบรารี่ต่อไปนี้ไม่ปลอดภัยสำหรับเธรด ไม่แนะนำให้ใช้ในสภาพแวดล้อมแบบมัลติเธรด

  • SNMP (Unix)
  • mSQL (Unix)
  • IMAP (Win / Unix)
  • Sybase-CT (Linux, libc5)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.