2009-02-26 69 views
6

Gần đây tôi đã đọc về http://php.net/pcntl và đã làm tổn thương các chức năng hoạt động tốt như thế nào và nếu nó thông minh để sử dụng đa luồng trong PHP vì nó không phải là chức năng cốt lõi của PHP.Đa luồng trong PHP

Tôi muốn kích hoạt các sự kiện không yêu cầu phản hồi thông qua thao tác như thực hiện thủ công cronjob theo cách thủ công.

Tất cả của nó là vụ phải chạy trong một ứng dụng web viết bằng Zend Framework

Trả lời

7

Gói pcntl hoạt động khá tốt - nó chỉ sử dụng theo unix functions. Sự thiếu hụt duy nhất là bạn không thể sử dụng chúng nếu php được gọi từ ngữ cảnh của máy chủ web. tức là bạn có thể sử dụng nó trong các kịch bản trình bao, nhưng không được sử dụng trên các trang web - ít nhất là không sử dụng hack như calling a forking script with exec hoặc tương tự.

[sửa] Tôi vừa tìm thấy một trang giải thích why mod_php cannot fork. Về cơ bản nó là một vấn đề an ninh. [/ edit]

+0

chết tiệt Tôi muốn sử dụng nó trong webapp: ( – Thomaschaaf

2

Cách duy nhất để thực thi mã php trong nhiều chủ đề là chạy php dưới dạng mô-đun của máy chủ web luồng, vô dụng vì chuỗi được phân tách hoàn toàn và mã của bạn không kiểm soát được chúng . Theo như tôi biết, pcntl chỉ quản lý các quy trình, chứ không phải chủ đề.

4

Đây không phải là điều khiển luồng, đây là điều khiển quá trình. Thư viện cho các chủ đề là pthreads (POSIX threads) và nó không được bao gồm trong PHP, do đó, không có chức năng đa luồng trong PHP.

Khi đa xử lý, bạn không thể sử dụng trong mod_php, vì đó sẽ là lỗ hổng bảo mật khổng lồ (quy trình sinh ra sẽ có tất cả các đặc quyền của máy chủ web).

2

Nếu tôi cần thực hiện các thao tác crontab thủ công hoặc tương tự từ PHP, tôi có thể sử dụng hàng đợi. Có một bảng cơ sở dữ liệu mà bạn thêm công việc vào. Một quá trình khác, hoặc từ một cron hoặc chạy như một daemon, thực hiện các công việc khi chúng xuất hiện.

Một cách khác để thực hiện việc này là thiết lập một tập lệnh riêng và thực hiện HTTP GET với nó. Nó không phải là khá luồng, nhưng nó là một cách để bắn phá một lệnh khác trong PHP. Ví dụ: nếu tôi muốn chạy /usr/bin/somescript.sh theo yêu cầu, tôi sẽ có một somescript.php đã thực hiện cuộc gọi hệ thống. Điều này sẽ được trên một máy chủ ảo chỉ có thể truy cập từ localhost.

Tôi sẽ thực hiện cuộc gọi socket tới máy chủ web và NHẬN kịch bản. Điều quan trọng là để không phải đọc trên ổ cắm để nó không chặn. Nếu tôi muốn kiểm tra giá trị trả về của somescript.php, tôi sẽ thực hiện sau trong tập lệnh chính để ngăn chặn việc chặn.

Nếu somescript.php mất nhiều thời gian để thực thi (dài hơn tập lệnh gọi), bạn sẽ phải thực hiện một số phép thuật để ngăn chặn apache khỏi giết tập lệnh khi đóng socket.

1

Ví dụ về đa luồng làm việc trong PHP (với trích đoạn từ các trang dự án của họ):

Tính đến 25 tháng 10 năm 2011, mô-đun này đã đạt đến "cuối đời" và bị phản đối ủng hộ của các dự án như Elysia Cron. Mô-đun này không hoàn toàn vô dụng trong đó một bản vá cốt lõi lấy cảm hứng từ Cron MT đã cam kết với D7.

... cung cấp tính năng lưu trữ trang tĩnh cho Drupal cho phép hiệu suất rất đáng kể và tăng khả năng mở rộng cho các trang web nhận lưu lượng truy cập vô danh. Đối với chia sẻ lưu trữ này là lựa chọn tốt nhất của bạn trong việc cải thiện hiệu suất. Trên các máy chủ chuyên dụng, bạn có thể muốn xem xét Varnish thay thế.