WordPress có thể được thực hiện để hỗ trợ websockets không?


18

Websockets là một công nghệ tiên tiến, thú vị được gói gọn trong HTML5. Về cơ bản, bạn có thể mở websocket để cho phép liên lạc 2 chiều liên tục với máy chủ web. Máy khách (giao diện người dùng) có thể tự động gửi tin nhắn và máy chủ cũng có thể gửi tin nhắn.

Công nghệ hiện tại (JavaScript) yêu cầu mọi thứ phải được khởi động bởi máy khách - máy chủ không thể gửi bất cứ thứ gì cho máy khách mà máy khách không yêu cầu. Vì vậy, các kịch bản cần phải liên tục làm mới và yêu cầu lại dữ liệu có thể không thay đổi. Websockets hoạt động nhiều hơn trên cơ sở " đẩy " và để dữ liệu mới đi xuống bất cứ khi nào.

Thật không may, hầu hết (tất cả những gì tôi có thể tìm thấy, dù sao) việc triển khai websocket yêu cầu một ứng dụng máy chủ cụ thể để hoạt động. Mọi người sẽ chạy Apache trên các cổng 80 và 443 (http và https) và chạy một hệ thống khác (thường là Node.js) trên một cổng khác (tức là 8000 hoặc 8080) để xử lý các yêu cầu websocket.

Điều này hoạt động, rõ ràng, nhưng nó có một số nhược điểm.

Tôi có một plugin tôi muốn xây dựng sẽ giúp ích rất nhiều cho việc sử dụng websockets trong WordPress. Nhưng nếu người dùng cần cài đặt máy chủ web thứ hai (thường là không thể đối với những người có lưu trữ chia sẻ), thì nó sẽ không hoạt động như một plugin.

Vì vậy, đối với bất kỳ ai trong số các bạn có kinh nghiệm, làm thế nào để bạn tương thích với WordPress với websockets? Bạn có thể làm cho WordPress tự xử lý giao tiếp hoặc gói một tập lệnh máy chủ mini khác vào plugin không? Nếu bạn đã thực hiện điều này rồi, làm thế nào bạn hoàn thành nó mà không phá vỡ chính WordPress?

Tài nguyên có thể?


21/21/11 Cập nhật

Với tất cả các cuộc thảo luận về cách Apache (máy chủ được cài đặt phổ biến nhất để chạy WP trên máy chủ được chia sẻ) thực sự không thể xử lý các ổ cắm web, tôi tự hỏi về một giải pháp thay thế. Một số plugin (ví dụ JetPack) nói chuyện với một dịch vụ bên ngoài hoặc API để tạo nội dung.

Số liệu thống kê yêu cầu nội dung từ Automattic. Akismet gửi dữ liệu qua lại từ một máy chủ bên ngoài. Sau khi Hạn chót nộp nội dung tại thời điểm xuất bản. Một vài công cụ SEO chuyển mọi thứ qua lại thông qua các hệ thống bên ngoài.

Vì vậy, thay vì sử dụng mã websocket trong plugin WordPress, việc lưu trữ dịch vụ websocket ở vị trí trung tâm và thay vào đó có một giao diện WordPress tương tác với nó là khả thi?


3
Điểm mấu chốt là đây: Nếu websockets không hoạt động tốt với máy chủ web gốc, thì bạn không thể dễ dàng làm điều đó với máy chủ web đó. Đây không phải là một vấn đề cụ thể của WordPress. Như bạn đã nói, các websockets thường yêu cầu một máy chủ riêng biệt như node.js hoặc một cái gì đó, chúng sẽ không hoạt động tốt với Apache. Vì vậy, vấn đề của bạn không phải là một trong "làm thế nào để tôi tương thích với WordPress", đó là "làm thế nào để tôi làm việc với dịch vụ lưu trữ mẫu số chung thấp nhất", đó là một ấm cá khác.
Otto

Có thể thêm hỗ trợ WebSocket vào lõi WordPress, với máy chủ WebSocket tích hợp và điểm cuối như admin-ajax.php, phải không? Ngoài ra còn có thư viện phụ trợ JavaScript frontend / Node.js Socket.IO cho WebSocket với việc bỏ phiếu dưới dạng dự phòng, được phát triển bởi Automattic, công ty đứng sau WordPress.
baptx

Câu trả lời:


8

WebSockets sử dụng giao thức websockets: WS: /example.com/yourscript.js và mở kết nối đồng bộ - có nghĩa là kết nối được giữ mở và dành riêng cho trình duyệt.

Các máy chủ httpd, như apache2 (được sử dụng bởi hầu hết các nhà cung cấp dịch vụ lưu trữ chia sẻ) sử dụng giao thức http: http://example.com/yourscript.jsvà mở kết nối không đồng bộ - có nghĩa là không có kết nối nào được mở giữa máy chủ và trình duyệt. (Bạn có thể kéo dài các kết nối mở một cách khiêm tốn bằng cách đặt các tham số cấu hình nhất định - nhưng nói chung, nó không đồng bộ.)

Như bạn có thể tưởng tượng, việc duy trì các kết nối mở giữa trình duyệt và máy chủ sẽ dành nhiều tài nguyên máy chủ hơn cho mỗi kết nối trình duyệt và do đó sẽ đánh thuế tài nguyên máy chủ nhiều hơn so với việc hủy kết nối sau mỗi yêu cầu. Các nhà cung cấp dịch vụ lưu trữ được chia sẻ có thể không đồng ý hỗ trợ WS trên dịch vụ lưu trữ được chia sẻ.

Mặc dù một số máy chủ được chia sẻ nhất định có thể đã cài đặt mod_python, do đó cho phép người dùng plugin của bạn chạy pywebsocket , tài liệu riêng của pywebsocket nói rõ rằng "pywebsocket dành cho mục đích thử nghiệm hoặc thử nghiệm."

Vì vậy, trong khi người ta có thể tưởng tượng một plugin gói mã python để tạo một máy chủ pywebsocket, được cung cấp một máy chủ apache hỗ trợ nó, tôi không tin rằng việc phân phối một plugin đã làm như vậy là hợp lý.


Có một vài thư viện PHP thẳng thắn tuyên bố hỗ trợ websockets. Việc họ có làm việc hiệu quả trong Apache hay không sẽ là một thử nghiệm thú vị. Xem cập nhật của tôi cho các liên kết ...
EAMann

3

Đáp lại cập nhật của bạn, theo ý kiến ​​của tôi và dựa trên nghiên cứu tôi đã thực hiện, đó sẽ là lựa chọn tốt nhất. Thậm chí tốt hơn là tạo plugin giao diện người dùng và tạo dịch vụ websocket bên ngoài để nói chuyện với các plugin và tính phí cho nó để bạn có thể kiếm tiền từ ý tưởng của mình, nếu bạn muốn. Bạn thậm chí có thể cung cấp mã nguồn cho dịch vụ websocket và tạo một cài đặt trong plugin để đặt vị trí (tên miền / IP và cổng) của dịch vụ websocket.


2

Hãy quên apache2 "cổ điển" - apache2-mpm-prefork - cho mục đích này. Có lẽ apache2-mpm-event có thể xử lý việc này, nhưng nó là thử nghiệm. Vì apache2 không phải là sự kiện, nên vấn đề được mô tả bởi @marfarma vẫn tồn tại. Bạn sẽ cần một máy chủ web hướng sự kiện cho loại phục vụ này, ví dụ như cherokee hoặc nginx.

nginx có thể là một lợi ích thực sự cho WordPress (vì wordpress.com cũng sử dụng nó như máy chủ của họ) và ví dụ, nó có thể ủy quyền các yêu cầu được chỉ định cho dịch vụ node.js.

Một số ví dụ trong chủ đề:

Tôi cũng đã thực hiện một hướng dẫn nhỏ cho thiết lập nginx + php-fpm + wordpress .


Quên cách tiếp cận "cổ điển" thực sự không phải là một lựa chọn để tạo ra một plugin dễ cài đặt cho người dùng giáo dân. Có, sử dụng nginx, cherokee hoặc node.js để phục vụ mọi thứ từ máy chủ là một tùy chọn, nhưng bạn không thể đặt nó trong plugin readme và hy vọng người dùng sẽ a) hiểu nó hoặc b) có thể làm bất cứ điều gì về nó
EAMann

apache2-mpm-prefork không được thiết kế để có thể xử lý loại sử dụng này. Có các plugin yêu cầu memcached, APC, v.v., vì vậy điều này chỉ có thể yêu cầu máy chủ web dựa trên sự kiện. Đây là một yêu cầu phụ trợ, mpm-prefork và mpm-worker không dành cho việc này.
petermolnar

1

Một giải pháp tiềm năng khác là sử dụng nhà cung cấp ổ cắm web của bên thứ ba, tôi đã chơi một chút với Pizer (http://pizer.com/) một chút, có một API bạn có thể sử dụng để có thể hoạt động tốt cho những gì bạn Tôi đang cố gắng làm. Tôi đã suy nghĩ về cách tôi có thể sử dụng nó trong các trang web WordPress của riêng tôi.

Một bất lợi có thể là những người khác đang cố gắng sử dụng plugin của bạn cũng sẽ phải có tài khoản Pizer để làm cho nó hoạt động. Làm việc với nó dễ dàng hơn nhiều so với việc cài đặt máy chủ Web Sockets của riêng bạn và phải duy trì nó, đó thực sự sẽ là một lợi thế khi người khác cố gắng sử dụng plugin của bạn.


0

Câu trả lời ngắn gọn là: có, nó có thể. Mặc dù vậy, tôi có thể xem xét một cái gì đó phân tán hơn một chút so với một điểm lỗi VPS mà bạn lưu trữ. Có thể nhìn vào một số hệ thống EC2 hoặc somesuch cân bằng tải? (Tôi giả sử bạn có một nguồn doanh thu để cung cấp những tiện ích như vậy. Cười )


1
"một luồng doanh thu để cung cấp cho các tiện ích như vậy" ... thật tuyệt :-)
EAMann
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.