2013-05-09 35 views
20

Tôi có một ứng dụng PHP hiện có, mà tôi cần thêm các thông báo thời gian thực. Để đạt được điều này, tôi đã cài đặt node.js (có ý định thêm socket.io cho tất cả chức năng thời gian thực)Thêm Node.js (cho thông báo thời gian thực) vào một ứng dụng PHP hiện có

Tuy nhiên. Mặc dù trải qua ba giờ đồng hồ nghiên cứu và cố gắng để có được đầu của tôi xung quanh làm thế nào để tích hợp hai, tôi đã thấy mình không gần gũi hơn để đạt được một sự hiểu biết.

Tôi hiện đang sử dụng như sau:

  • Apache
  • PHP
  • Nginx (như một reverse proxy để Apache cho tất cả các nội dung tĩnh như images/file css vv)
  • MySQL

Tôi đã viết mã để gửi sự kiện từ máy khách đến PHP và chèn một thông báo tion vào cơ sở dữ liệu. Khi người nhận làm mới trang của họ, tất nhiên họ sẽ thấy thông báo. Tôi chỉ cần node.js để xử lý thời gian thực đẩy cho khách hàng nhưng tôi đang thua lỗ về cách thiết lập nó.

Những gì tôi thực sự cần phải biết, được đưa ra kịch bản này, như sau:

  1. Làm thế nào/khi là kết nối Node.js/WebSocket cho khách hàng khởi tạo, được đưa ra mà tôi muốn tất cả các nội dung để vẫn được phục vụ thông qua Apache/PHP?
  2. Làm cách nào để gửi tin nhắn từ PHP đến Node.js và hướng dẫn nó để đẩy thông báo cho khách hàng?
  3. Tôi cần phải sửa đổi loại kết thúc nào để thiết lập để hỗ trợ điều này?

Cuối cùng tôi muốn chỉ đơn giản là có thể chạy một hàm PHP và mong đợi node.js/socket.io/websockets để đẩy thông báo đến máy khách. Tôi chỉ không có ý tưởng làm thế nào để đạt được điều đó.

Cảm ơn bạn trước vì bất kỳ ví dụ/thông tin/hướng dẫn nào.

+0

1. Khi khách hàng yêu cầu nó; 2. [Thông qua HTTP] (http://stackoverflow.com/questions/10048978/sending-messages-from-php-to-node-js); 3. [Thiết lập nginx] (http://stackoverflow.com/questions/5009324/node-js-nginx-and-now). –

Trả lời

17

Điều tôi sẽ làm trong trường hợp này là thiết lập máy chủ Node.js với Socket.IO. Điều này cung cấp cho bạn một phương pháp trình duyệt chéo để gửi dữ liệu gần thời gian thực cho khách hàng.

Khi khách hàng tải trang PHP của bạn, bạn sẽ có thẻ <script> trỏ vào máy chủ Node.js của bạn để tải Socket.IO. Sau khi được nạp, máy khách JavaScript Socket.IO sẽ kết nối với máy chủ Socket.IO của Node.js của bạn và chờ các sự kiện được phát ra.

Bây giờ, vì bạn muốn các sự kiện này được gửi từ PHP, bạn cần có kênh liên lạc giữa ứng dụng PHP và Node.js. Tôi khuyên bạn nên using Redis pub/sub cho việc này. Về cơ bản, ứng dụng PHP của bạn xuất bản một thông báo và các máy chủ Node.js của bạn đã đăng ký với nó sẽ nhận được nó. Những máy chủ đó sau đó có thể ngay lập tức truyền một thông điệp cho khách hàng để lấy thêm dữ liệu từ PHP. (Tôi nghĩ bạn sẽ thấy mặc dù có thể dễ dàng để máy chủ Node.js của bạn chỉ gửi dữ liệu đó ngay từ đầu.)

Bạn có thể đặt Node.js vào máy chủ Nginx nếu muốn, but you need the latest and greatest version for true web socket support .

+1

Điều này nghe có vẻ hoàn hảo, đặc biệt là vì tôi đã sử dụng Redis để tạo luồng hoạt động. Phần về việc sử dụng thẻ script giống như một bóng đèn đang tắt. Chính xác những gì tôi đã sau. Cảm ơn nhiều. – gordyr

+0

Thay vì sử dụng Redis làm kênh giao tiếp giữa PHP và Node.js, bạn nghĩ gì về việc gửi yêu cầu từ PHP đến ứng dụng Node.js bằng Curl? Tiếp theo, trên sự kiện yêu cầu trong ứng dụng Node.js, chúng ta sẽ phát ra dữ liệu/thông báo đến các ổ cắm được kết nối. – user345602

+2

@ user346665 Đó chắc chắn là một lựa chọn, nhưng bạn đang tái phát minh ra bánh xe với pub/sub, và sau đó bạn sẽ phải quản lý một danh sách các máy chủ lên/xuống, và đối phó với thực tế là kịch bản PHP của bạn là sẽ treo (trừ khi bạn sử dụng multicurl mà là một rắc rối thực sự cho một cái gì đó như thế này). – Brad

0

Câu hỏi này cũ nhưng tôi tìm thấy nó khi tôi đang cố gắng để thực hiện websockets vì vậy có lẽ điều này sẽ giúp người khác cần một giải pháp PHP tinh khiết có thể được tích hợp vào một dự án hiện có mà không có quá nhiều hack.

Ratchet - PHP WebSockets

Chỉ yêu cầu là zmq ràng buộc cho PHP, được sử dụng như phương pháp để truyền dữ liệu từ các kịch bản PHP của bạn đến máy chủ WebSocket của bạn. Nếu dụ PHP của bạn không được xây dựng với nó thì bạn có thể tìm thấy nó here

Github repo là here, rất nhiều ví dụ để giúp bạn đi là here

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