2009-03-25 29 views
46
  • PHP (có phải là 5,2) thread-safe trên Linux/UNIX không?
  • Có thể sử dụng nó với Apache Worker-MPM hoặc Event-MPM không?

Các dữ kiện tôi thu thập được cho đến nay là không phân thắng bại:Có an toàn cho chủ đề của PHP không?

  • Mặc định mã nhị phân có trong hầu hết các bản phân phối có ZTS tàn tật, vì vậy tôi biết, rằng tôi phải biên dịch lại chúng.
  • Về lý thuyết Zend Engine (lõi PHP) với ZTS được bật là an toàn chỉ.
  • Người ta nói rằng một số mô-đun có thể không an toàn cho luồng, nhưng tôi chưa tìm thấy bất kỳ danh sách mô-đun nào có hoặc không có.
  • PHP FAQ có trạng thái tương tự như trên.

Trải nghiệm của bạn là gì?

Không chỉ có khoảng segmentation faults ("vi phạm truy cập" trong danh pháp Windows). Có nhiều hơn nữa để thread safety.

+1

Trong khi đây là một chủ đề nóng, đó là một câu hỏi rất hay. Một cái gì đó hoặc là, hoặc không phải là chủ đề an toàn .. 'một nơi nào đó ở giữa' là một chủ đề tốt để thảo luận ở đây. –

+0

Xem cảnh báo chính thức của PHP: "* [Chúng tôi khuyên bạn không nên sử dụng MPM có luồng trong sản xuất với Apache 2] (http://web.archive.org/web/20160412170643/http://www.php.net/manual/ vi/install.unix.apache2.php) * ". Cũng liên quan: http://web.archive.org/web/20160412171006/https://docs.newrelic.com/docs/agents/php-agent/troubleshooting/threaded-apache-worker-mpms – Pacerier

Trả lời

20

Tôi biết gettext và set_locale không an toàn. PHP không nên được sử dụng với MPM có luồng.

PHP Isn't Thread-Safe Yet.
Running PHP not threaded.

+0

Có, tôi đã đọc bài viết đó trước đây. Nhưng nó không đưa ra nhiều sự kiện. Ngoài ra segfaults (hoặc "truy cập vi phạm") đã không thực sự có nhiều để làm với an toàn thread. – vartec

+2

Có. Nếu các segfaults là kết quả của các vi phạm truy cập bộ nhớ do truy cập luồng không chính xác đến các biến chia sẻ, thì đó chính xác là vấn đề bạn đang tìm cách tránh. Đó là * không chỉ * về segfaults/vi phạm truy cập, nhưng nếu nó không segfault sau đó không bận tâm tìm kiếm thêm nữa bởi vì nó chắc chắn không phải thread an toàn. –

+0

Vâng.Tôi đang sử dụng nginx với php-fpm vì gettext không an toàn thread: http://stackoverflow.com/questions/1646249/php-gettext-problems-like-non-thread-safe/6726570#6726570 – Stann

5

Câu hỏi hay hơn có thể là, "Mã PHP sau có kích hoạt vi phạm truy cập nếu sử dụng MPM không?" Hoặc, "Bạn có gặp phải hành vi kỳ quặc có thể do các vấn đề tương tranh sử dụng các chức năng sau không?"

Nếu không, đó là rulet Nga. Nếu bạn đang sử dụng một số ứng dụng đóng gói, nó có thể làm việc tốt ngay bây giờ nhưng phá vỡ một tháng kể từ bây giờ khi một phiên bản mới của ứng dụng đi ra.

Tôi đặc biệt khuyên bạn không nên sử dụng MPM với PHP nói chung. Tuy nhiên, nếu bạn có một số mã nhỏ để chạy, bạn có thể đăng nó, và chúng tôi có thể cho bạn biết nếu bạn đang đi để đạt một pitfall.

+2

mã thực sự có thể không an toàn cho luồng và không bao giờ gây ra bất kỳ vi phạm truy cập/xâm phạm nào. – vartec

+0

@ vartec, vâng, tôi đã chỉnh sửa câu trả lời của mình. –

+1

@TimPost, tôi không hiểu tại sao bạn nói đó là "roulette Nga". Nếu mã thực sự an toàn với luồng, thì sẽ an toàn khi sử dụng ** bất kể ** bao nhiêu chuỗi đồng thời đang gọi nó. Ngay cả khi bạn không may mắn tại "roulette Nga" (bởi vì tôi cho rằng bạn có nghĩa là các chủ đề đồng thời xen kẽ ở mọi bước và ở tất cả các nơi tồi tệ nhất), nó vẫn an toàn nếu mã là an toàn thread và chúng tôi sẽ không nhận được một segfault . – Pacerier

6

Xem Where can I get libraries needed to compile some of the optional PHP extensions? để biết danh sách các tiện ích mở rộng an toàn chủ đề và an toàn nonthread (* được đánh dấu không an toàn chủ đề và các tiện ích khác).

+0

Danh sách này hoạt động cho các tiện ích, nhưng không liệt kê các tính năng không an toàn của chuỗi của ** không ** - tiện ích mở rộng. Ví dụ: ['setlocale'] (http://php.net/manual/en/function.setlocale.php#refsect1-function.setlocale-notes) như được đề cập bởi userOIS ở trên. – Pacerier

Các vấn đề liên quan