Chủ đề an toàn hay không an toàn trong luồng là gì?


773

Tôi đã thấy các tệp nhị phân khác nhau cho PHP, như luồng không hoặc luồng an toàn?

Điều đó có nghĩa là gì?

Sự khác biệt giữa các gói này là gì?


18
Bạn có thể đọc về chủ đề An toàn trên en.wikipedia.org/wiki/Thread_safety Về PHP: Là PHP thread-safe không tin rằng Lies: PHP không phải là thread-Safe Tuy nhiên, sự khác biệt giữa PHP chủ đề an toàn và không đề binarie an toàn Có có rất nhiều tài nguyên có sẵn. Tìm kiếm ở đây tại Stackoverflow hoặc Google.
TigerTiger

Câu trả lời:


668

Nền tảng cần thiết về phương pháp tiếp cận đồng thời:

Các máy chủ web khác nhau thực hiện các kỹ thuật khác nhau để xử lý song song các yêu cầu HTTP đến. Một kỹ thuật khá phổ biến là sử dụng các luồng - đó là máy chủ web sẽ tạo / dành riêng một luồng cho mỗi yêu cầu đến. Máy chủ web Apache HTTP hỗ trợ nhiều mô hình để xử lý các yêu cầu, một trong số đó (được gọi là MPM worker) sử dụng các luồng. Nhưng nó hỗ trợ một mô hình tương tranh khác gọi là MPM prefork sử dụng các quy trình - đó là máy chủ web sẽ tạo / dành một quy trình duy nhất cho mỗi yêu cầu.

Ngoài ra còn có các mô hình đồng thời hoàn toàn khác nhau (sử dụng ổ cắm không đồng bộ và I / O), cũng như các mô hình trộn hai hoặc thậm chí ba mô hình với nhau. Với mục đích trả lời câu hỏi này, chúng tôi chỉ quan tâm đến hai mô hình ở trên và lấy máy chủ HTTP Apache làm ví dụ.

Nền tảng cần thiết về cách PHP "tích hợp" với các máy chủ web:

Bản thân PHP không đáp ứng với các yêu cầu HTTP thực tế - đây là công việc của máy chủ web. Vì vậy, chúng tôi định cấu hình máy chủ web để chuyển tiếp yêu cầu tới PHP để xử lý, sau đó nhận kết quả và gửi lại cho người dùng. Có nhiều cách để xâu chuỗi máy chủ web với PHP. Đối với Máy chủ HTTP Apache, phổ biến nhất là "mod_php". Mô-đun này thực sự là chính PHP, nhưng được biên dịch thành một mô-đun cho máy chủ web và do đó, nó được tải ngay bên trong nó.

Có nhiều phương pháp khác để kết nối PHP với Apache và các máy chủ web khác, nhưng mod_php là phương thức phổ biến nhất và cũng sẽ phục vụ cho việc trả lời câu hỏi của bạn.

Bạn có thể không cần phải hiểu những chi tiết này trước đây, bởi vì các công ty lưu trữ và các bản phân phối GNU / Linux đi kèm với mọi thứ được chuẩn bị cho chúng tôi.

Bây giờ, vào câu hỏi của bạn!

Vì với mod_php, PHP được tải ngay vào Apache, nếu Apache sẽ xử lý đồng thời bằng MPM Worker của nó (nghĩa là sử dụng Chủ đề) thì PHP phải có thể hoạt động trong cùng môi trường đa luồng này - nghĩa là, PHP phải an toàn cho chủ đề để có thể chơi bóng chính xác với Apache!

Tại thời điểm này, bạn nên suy nghĩ "OK, vì vậy nếu tôi đang sử dụng máy chủ web đa luồng và tôi sẽ nhúng PHP ngay vào nó, thì tôi phải sử dụng phiên bản PHP an toàn luồng". Và đây sẽ là suy nghĩ chính xác. Tuy nhiên, như nó xảy ra, an toàn luồng của PHP bị tranh chấp rất cao . Đó là một nền tảng sử dụng-nếu-bạn-thực sự-thực sự-biết-những gì bạn đang làm.

Ghi chú cuối cùng

Trong trường hợp bạn đang tự hỏi, lời khuyên cá nhân của tôi sẽ là không sử dụng PHP trong môi trường đa luồng nếu bạn có sự lựa chọn!

Chỉ nói về các môi trường dựa trên Unix, tôi nói rằng may mắn thay, bạn chỉ phải nghĩ về điều này nếu bạn sẽ sử dụng PHP với máy chủ web Apache, trong trường hợp đó bạn nên đi với MPM prefork của Apache (mà không sử dụng các luồng và do đó, an toàn luồng của PHP không thành vấn đề) và tất cả các bản phân phối GNU / Linux mà tôi biết sẽ đưa ra quyết định đó cho bạn khi bạn cài đặt Apache + PHP thông qua hệ thống gói của chúng, mà không cần nhắc bạn cho một sự lựa chọn Nếu bạn định sử dụng các máy chủ web khác như nginx hoặc lighttpd , bạn sẽ không có tùy chọn nhúng PHP vào chúng. Bạn sẽ xem xét sử dụng FastCGI hoặc một cái gì đó tương đương hoạt động trong một mô hình khác trong đó PHP hoàn toàn nằm ngoàicủa máy chủ web có nhiều quy trình PHP được sử dụng để trả lời các yêu cầu thông qua ví dụ FastCGI. Đối với những trường hợp như vậy, an toàn luồng cũng không thành vấn đề. Để xem phiên bản nào trang web của bạn đang sử dụng, hãy đặt một tệp chứa <?php phpinfo(); ?>trên trang web của bạn và tìm Server APImục nhập. Điều này có thể nói một cái gì đó như CGI/FastCGIhoặc Apache 2.0 Handler.

Nếu bạn cũng xem phiên bản dòng lệnh của PHP - an toàn luồng không thành vấn đề.

Cuối cùng, nếu an toàn luồng không quan trọng thì bạn nên sử dụng phiên bản nào - an toàn luồng hay không an toàn luồng? Thành thật mà nói, tôi không có câu trả lời khoa học! Nhưng tôi đoán rằng phiên bản không an toàn luồng nhanh hơn và / hoặc ít lỗi hơn, hoặc nếu không, họ sẽ chỉ cung cấp phiên bản an toàn luồng và không bận tâm để cho chúng tôi lựa chọn!


2
Vì vậy, PHP-FPM không được phân luồng? Điều đó giải quyết vấn đề sau đó vì Fast CGI được sử dụng trên các máy chủ nginx.
Xeoncross

41
Tuyệt vời chi tiết, tôi đã lập trình trong PHP trong nhiều năm và không bao giờ biết điều này.
Patrick

1
@Xeoncross: Nói chung là đúng và trong thực tế, đó là một trong những lý do tuyệt vời để quản lý các quy trình PHP bên ngoài Apache. Tôi đi qua khía cạnh này trong câu trả lời của tôi.
JM Becker

Vấn đề duy nhất ở đây là PHP-FPM không có sẵn trong Windows. Ít nhất là một bản dựng.
Denis V

9
Có phải an toàn luồng của PHP vẫn còn "tranh chấp cao" (năm 2015 và phiên bản 7) không?
Altiano Gerung

261

Đối với tôi, tôi luôn chọn phiên bản an toàn không luồng vì tôi luôn sử dụng nginx hoặc chạy PHP từ dòng lệnh.

Phiên bản an toàn không có luồng nên được sử dụng nếu bạn cài đặt PHP dưới dạng nhị phân CGI, giao diện dòng lệnh hoặc môi trường khác trong đó chỉ sử dụng một luồng duy nhất.

Nên sử dụng phiên bản an toàn luồng nếu bạn cài đặt PHP dưới dạng mô-đun Apache trong MPM công nhân (mô hình đa xử lý) hoặc môi trường khác có nhiều luồng PHP chạy đồng thời.


1
greg câu trả lời của bạn nên có: "Nên sử dụng phiên bản Thread Safe nếu bạn muốn cài đặt PHP làm mô-đun Apache trong đó worker là MPM"
wlf

9
Vậy php đi kèm với xampp trên windows là NTS hay TS?
Abudayah

1
Điều gì nếu bạn sử dụng máy chủ web tích hợp PHP? Biến thể nào của PHP để sử dụng cho hiệu suất tối ưu?
Ariod

1
@Dario Tôi nghĩ đó chỉ là Windows.
Greg

1
@ChristopherShaw anh bạn, câu trả lời chỉ chứa ý kiến. Không có nguồn hoặc lý do TẠI SAO để sử dụng ZTS kết hợp với mô-đun Apache. Nó không phải là một câu trả lời hợp lệ. Thậm chí 217 ppl có thể sai m8.
Daniel W.

30

Apache MPM prefork với modphp được sử dụng vì dễ cấu hình / cài đặt. Hiệu suất-khôn ngoan nó là không hiệu quả. Cách ưa thích của tôi để thực hiện ngăn xếp, FastCGI / PHP-FPM. Bằng cách đó bạn có thể sử dụng MPM Worker nhanh hơn nhiều. Toàn bộ PHP vẫn không có luồng, nhưng Apache phục vụ luồng (giống như vậy).

Về cơ bản, từ dưới lên trên

Linux

Công nhân Apache + MPM + ModFastCGI (KHÔNG FCGI) | (hoặc) | Cherokee | (hoặc) | Nginx

PHP-FPM + APC

ModFCGI không hỗ trợ chính xác PHP-FPM hoặc bất kỳ ứng dụng FastCGI bên ngoài nào. Nó chỉ hỗ trợ các tập lệnh FastCGI không được quản lý. PHP-FPM là trình quản lý quy trình FastCGI của PHP.


21

Theo Tài liệu PHP ,

An toàn luồng có nghĩa là gì khi tải xuống PHP?

Thread Safety có nghĩa là nhị phân có thể hoạt động trong bối cảnh máy chủ web đa luồng, chẳng hạn như Apache 2 trên Windows. An toàn luồng hoạt động bằng cách tạo một bản sao lưu trữ cục bộ trong mỗi luồng, để dữ liệu không bị xung đột với luồng khác.

Vậy tôi chọn cái gì? Nếu bạn chọn chạy PHP dưới dạng nhị phân CGI, thì bạn sẽ không cần an toàn luồng, vì nhị phân được gọi ở mỗi yêu cầu. Đối với các máy chủ web đa luồng, chẳng hạn như IIS5 và IIS6, bạn nên sử dụng phiên bản luồng của PHP.

Thư viện sau đây không phải là chủ đề an toàn. Chúng không được khuyến khích sử dụng trong môi trường đa luồng.

  • SNMP (Unix)
  • mQuery (Unix)
  • IMAP (Win / Unix)
  • Sybase-CT (Linux, libc5)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.