Xem xét ứng dụng web PHP có mục đích là chấp nhận yêu cầu của người dùng để bắt đầu công việc không đồng bộ chung và sau đó tạo quy trình/chuỗi công nhân để chạy công việc. Các công việc không đặc biệt là CPU hoặc bộ nhớ chuyên sâu, nhưng dự kiến sẽ chặn trên các cuộc gọi I/O khá thường xuyên. Không nên khởi động nhiều hơn một hoặc hai lần mỗi giây, nhưng do thời gian chạy dài nên có thể có nhiều công việc đang chạy cùng một lúc.xử lý không đồng bộ với PHP - một công nhân cho mỗi công việc
Do đó, điều quan trọng nhất là các công việc chạy song song. Ngoài ra, mỗi công việc phải được giám sát bởi người quản lý có trách nhiệm giết người lao động, hủy bỏ công nhân theo yêu cầu của người dùng, v.v.
Cách tốt nhất để thực hiện một hệ thống như thế này là gì? Tôi có thể thấy:
- Đưa công nhân ra khỏi trình quản lý - đây dường như là tùy chọn cấp thấp nhất và tôi phải tự mình thực hiện hệ thống giám sát. Apache là máy chủ web, do đó, nó xuất hiện rằng tùy chọn này sẽ yêu cầu bất kỳ công nhân PHP nào được bắt đầu thông qua FastCGI.
- Sử dụng một số loại hàng đợi công việc/tin nhắn. (gearman, beanstalkd, RabbitMQ, vv) - Ban đầu, điều này dường như là sự lựa chọn hiển nhiên. Sau một số nghiên cứu, tôi hơi bối rối với tất cả các tùy chọn. Ví dụ, Gearman trông giống như nó được thiết kế cho các hệ thống phân tán lớn, nơi có một nhóm công nhân cố định ... vì vậy tôi không biết liệu nó có phù hợp với những gì tôi cần (một công nhân cho mỗi công việc) hay không.
Cảm ơn. Tôi đã làm điều này một vài lần bây giờ, và nó hoạt động thực sự tốt. Vâng, tôi nên nói nó hoạt động thực sự tốt nếu trường hợp sử dụng của bạn được liên kết với những hạn chế của hệ thống (IPC là khá tốn kém, vv). Nếu chúng không được liên kết rất tốt, bạn nên sử dụng thực thi luồng đúng và một ngôn ngữ khác với PHP ... – ircmaxell
Hãy cẩn thận với 'pcntl_fork()'. Tôi đã có vấn đề với các kết nối cơ sở dữ liệu được chia sẻ theo những cách kỳ lạ giữa các tiến trình cha và con. Tôi sẽ không ngạc nhiên nếu một số phần mở rộng PECL chia sẻ những điều kỳ quặc tương tự. Tôi e ngại bỏ qua PHP và tạo ra các tiến trình riêng biệt thông qua 'exec()' và tương tự, chỉ để giữ cho mọi thứ đơn giản là –
Vâng, tôi rõ ràng mở lại tất cả các kết nối trong đứa trẻ sau khi forking vì lý do đó. Ngã ba là không có gì phải sợ (tôi sử dụng nó khá thường xuyên). Nhưng đó là rất nhiều thử và sai vì không có nhiều tài liệu về chủ đề này. Vấn đề với việc thực hiện thông qua 'exec', nó làm cho việc giao tiếp và giám sát trở nên khó khăn hơn (vì một lệnh' exec' đang chặn, và hai khó khăn hơn để có được quá trình id của một cuộc gọi 'exec' không chặn (một cuộc gọi) với một '&' được nối vào cuối)) ... – ircmaxell