và cảm ơn bạn đã xem câu hỏi.Làm thế nào để IPC giữa các máy khách PHP và máy chủ C Daemon?
Nền
Tôi có một số máy liên tục sinh ra nhiều kịch bản lệnh PHP (lên đến 300) trong một khung thời gian rất ngắn. Các tập lệnh này chạy nhanh (ít hơn một giây) và sau đó thoát. Tất cả các kịch bản này chỉ cần đọc quyền truy cập vào cấu trúc trie lớn sẽ rất tốn kém để tải vào bộ nhớ mỗi khi mỗi một tập lệnh chạy. Máy chủ chạy Linux.
Giải pháp của tôi
Tạo C daemon giữ cấu trúc bộ nhớ trong bộ nhớ và nhận yêu cầu từ máy khách PHP. Nó sẽ nhận được yêu cầu từ tất cả các máy khách PHP, thực hiện tra cứu cấu trúc bộ nhớ và trả lời với câu trả lời, lưu các tập lệnh PHP khỏi thực hiện công việc đó. Cả hai yêu cầu và phản ứng là chuỗi ngắn (không quá 20 ký tự)
Vấn đề của tôi
Tôi rất mới để daemon C và thông tin liên lạc quá trình liên. Sau nhiều nghiên cứu, tôi đã thu hẹp các lựa chọn xuống Message Queues và các ổ cắm miền Unix. Hàng đợi tin nhắn có vẻ thích hợp bởi vì tôi nghĩ rằng (tôi có thể sai) rằng họ xếp hàng tất cả các yêu cầu cho daemon để trả lời chúng một cách thẳng thắn. Tuy nhiên, các ổ cắm miền Unix dường như dễ sử dụng hơn. Tuy nhiên, tôi có nhiều câu hỏi khác nhau mà tôi không thể tìm thấy câu trả lời cho:
- Làm thế nào một tập lệnh PHP gửi và nhận tin nhắn hoặc sử dụng ổ cắm UNIX để giao tiếp với daemon? Ngược lại, làm thế nào để C daemon theo dõi quá trình PHP mà nó phải gửi trả lời?
- Hầu hết các ví dụ về daemon tôi đã thấy sử dụng vòng lặp vô hạn trong khi có trạng thái ngủ bên trong. Daemon của tôi cần phục vụ nhiều kết nối có thể đến bất cứ lúc nào và độ trễ phản hồi là rất quan trọng. Daemon sẽ phản ứng như thế nào nếu kịch bản lệnh PHP gửi một yêu cầu trong khi nó đang ngủ? Tôi đã đọc về thăm dò ý kiến và epoll, đây có phải là cách chính xác để chờ tin nhắn nhận được không?
- Mỗi quy trình PHP sẽ luôn gửi một yêu cầu, và sau đó sẽ đợi để nhận phản hồi. Tôi cần đảm bảo rằng nếu daemon bị hỏng/không có sẵn, quá trình PHP sẽ chờ phản hồi trong một khoảng thời gian tối đa đã đặt và nếu không nhận được câu trả lời nào sẽ tiếp tục bất kể thay vì treo. Điều này có thể được thực hiện?
Tra cứu cơ cấu dữ liệu thực sự rất nhanh, tôi không cần bất kỳ giải pháp đa luồng phức tạp hoặc giải pháp tương tự nào, vì tôi tin rằng việc xử lý yêu cầu theo cách FIFO sẽ là đủ. Tôi cũng cần phải giữ nó đơn giản ngu ngốc, vì đây là một dịch vụ quan trọng nhiệm vụ, và tôi khá mới đối với loại chương trình này. (Tôi biết, nhưng tôi thực sự không có cách nào để giải quyết vấn đề này và trải nghiệm học tập sẽ tuyệt vời)
Tôi thực sự đánh giá cao các đoạn mã chiếu sáng một số câu hỏi cụ thể mà tôi có. Liên kết đến hướng dẫn và con trỏ sẽ tiếp tục hiểu biết của tôi vào thế giới âm u này của IPC cấp thấp cũng được hoan nghênh.
Cảm ơn sự giúp đỡ của bạn!
Cập nhật
Biết nhiều hơn bây giờ hơn là tôi đã làm tại thời điểm đặt câu hỏi này, tôi chỉ muốn chỉ ra cho bất kỳ ai quan tâm rằng cả hai khuôn khổ Thrift và ZeroMQ làm một công việc tuyệt vời của abstracting đi chương trình cấp ổ cứng. Tiết kiệm thậm chí còn cung cấp cho bạn giàn giáo cho máy chủ miễn phí!
Trong thực tế, thay vì đi đến tất cả công việc khó khăn của việc xây dựng một máy chủ mạng, hãy xem xét chỉ viết cho bạn mã máy chủ ứng dụng bằng máy chủ không đồng bộ tốt đã giải quyết được sự cố cho bạn. Tất nhiên các máy chủ sử dụng IO không đồng bộ là tuyệt vời cho các ứng dụng mạng không yêu cầu xử lý CPU chuyên sâu (hoặc các khối vòng lặp sự kiện khác).
Ví dụ về python: Twisted, gevent. Tôi thích gevent, và tôi không bao gồm lốc xoáy vì nó tập trung vào phía máy chủ HTTP.
Ví dụ cho Ruby: EventMachine
Tất nhiên, Node.js về cơ bản là lựa chọn mặc định cho một máy chủ async hiện nay.
Nếu bạn muốn đi sâu hơn, hãy đọc C10k Problem và Unix Network Programing.
Vâng, daemon nên bỏ phiếu, và tôi tin rằng với unix socket tất cả các bạn phải làm là đã socket hỗ trợ biên dịch vào PHP .. nhưng tôi không hoàn toàn chắc chắn – Earlz