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ì?
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ì?
Câu trả lờ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ụ.
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.
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.
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 API
mục nhập. Điều này có thể nói một cái gì đó như CGI/FastCGI
hoặ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!
Đố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.
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.
Theo Tài liệu 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.