WordPressでWebSocketをサポートすることはできますか?


18

Websocketは、HTML5にラップされたクールで最先端のテクノロジーです。基本的に、websocketを開いて、Webサーバーとの永続的な双方向通信を有効にできます。クライアント(ユーザーインターフェイス)は自発的にメッセージを送信でき、サーバーもメッセージを送信できます。

既存のテクノロジー(JavaScript)では、クライアントがすべてを開始する必要があります。サーバーは、クライアントが要求していないものをクライアントに送信できません。そのため、スクリプトは、変更されていない可能性のあるデータを常に更新して再要求する必要があります。Websocketは「プッシュ」ベースでさらに機能し、いつでも新しいデータをパイプに流します。

残念ながら、ほとんどの(とにかく私が見つけることができるすべての)Websocket実装には、動作する特定のサーバーアプリケーションが必要です。ポート80と443(httpとhttps)でApacheを実行し、別のポート(つまり8000または8080)で別のシステム(通常はNode.js)を実行して、websocketリクエストを処理します。

これは明らかに機能しますが、いくつかの欠点があります。

WordPressでwebsocketを使用することで大きなメリットが得られるプラグインを作成します。しかし、ユーザーが2番目のWebサーバーをインストールする必要がある場合(通常、共有ホスティングを使用している人にとっては不可能)、プラグインとしては機能しません。

それで、経験のある人なら誰でも、WordPressをwebsocketと互換性を持たせるにはどうすればいいのでしょうか?WordPressに通信自体を処理させるか、別のミニサーバースクリプトをプラグインにバンドルしますか?すでにこれを行っている場合、WordPress自体を壊さずにどのように達成しましたか?

可能なリソース?


9/21/11更新

Apache(共有ホストでWPを実行するために最も一般的にインストールされるサーバー)がWebソケットをネイティブに実際に処理できない方法についてのすべての話で、私は代替案について疑問に思っています。いくつかのプラグイン(JetPackなど)は、外部サービスまたはAPIと通信してコンテンツを生成します。

StatsはAutomatticにコンテンツを要求します。Akismetは外部サーバーとの間でデータをやり取りします。締め切り後、公開時にコンテンツを送信します。いくつかのSEOツールは、外部システムを通じて物事をやり取りします。

したがって、WordPressプラグイン内にwebsocketコードを格納する代わりに、中央の場所でwebsocketサービスをホストし、代わりにWordPressフロントエンドと対話させることは可能でしょうか?


3
要するに、WebsocketがネイティブWebサーバーでうまく機能しない場合、そのWebサーバーで簡単にそれを行うことはできません。これはWordPress固有の問題ではありません。あなたが述べたように、websocketは一般にnode.jsなどのような別個のサーバーを必要としますが、Apacheとはうまく動作しません。あなたの問題は「WordPressと互換性を持たせる方法」ではなく、「最小公分母ホスティングで動作させる方法」であり、これは他の魚のケトルです。
オットー

WebSocketサポートは、組み込みのWebSocketサーバーとadmin-ajax.phpなどのエンドポイントを使用して、WordPressコアに追加できますか?また、JavaScriptのフロントエンド/ Node.jsバックエンドライブラリSocket.IOがあり、フォールバックとしてポーリングを使用するWebSocketがあります。これは、WordPressの会社であるAutomatticによって開発されています。
baptx

回答:


8

WebSocketsはwebsocketsプロトコルWS:/example.com/yourscript.jsを使用して同期接続を開きます。つまり、接続は開いたままで、ブラウザー専用になります。

(ほとんどの共有ホスティングプロバイダーで使用される)apache2のようなhttpdサーバーはhttpプロトコルを使用しhttp://example.com/yourscript.js、非同期接続を開きます。つまり、サーバーとブラウザーの間で接続が開かれません。(特定の構成パラメーターを設定することにより、オープン接続を控えめに延長できますが、一般的には非同期です。)

ご想像のとおり、ブラウザーとサーバー間のオープン接続を維持すると、各ブラウザー接続により多くのサーバーリソースが割り当てられるため、各リクエスト後に接続をドロップするよりもサーバーリソースに負担がかかります。共有ホスティングプロバイダーは、当然のことながら、共有ホスティングでWSをサポートしません。

特定の共有ホストにはmod_pythonがインストールされている可能性がありますが、それによりプラグインユーザーがpywebsocketを実行できるようになりますが、pywebsocket自身のドキュメントには「pywebsocketはテストまたは実験目的のためのものです」と明記されています。

だから、pywebsocketサーバーを作成するためにpythonコードをバンドルするプラグインを想像するかもしれませんが、それをサポートするApacheサーバーを考えると、そうするプラグインを配布することは合理的ではないと思います。


Websocketをサポートすると主張するいくつかのストレートなPHPライブラリがあります。Apache内で効果的に機能するかどうかは、興味深いテストです。リンクについては私の更新を参照してください...
EAMann

3

あなたの更新に応じて、私の意見では、私が行った調査に基づいて、それは非常に最良の選択肢です。さらに良いのは、フロントエンドプラグインを作成し、プラグインと通信する外部Websocketサービスを作成し、必要に応じてアイデアを収益化できるように料金を請求することです。websocketサービスのソースコードを提供し、プラグインにwebsocketサービスの場所(ドメイン/ IPおよびポート)を設定する設定を作成することもできます。


2

この目的のために、「古典的な」apache2-apache2-mpm-preforkを忘れてください。apache2-mpm-eventでこれを処理できるかもしれませんが、実験的です。apache2はイベント駆動型ではないため、@ marfarmaで説明されている問題は存在します。このようなサービスを提供するには、cherokeeやnginx などのイベント駆動型Webサーバーが必要です。

nginxは(Wordpress.comがサーバーとしても使用するので)WordPressにとって真の利点となり、たとえば、指定されたリクエストをnode.jsサービスにプロキシできます。

トピックのいくつかの例:

また、nginx + php-fpm + wordpress setupの小さなチュートリアルを作成しました


「古典的な」アプローチを忘れることは、一般ユーザー向けのインストールしやすいプラグインを作成するためのオプションではありません。はい、nginx、cherokee、またはnode.jsを使用してサーバーからサービスを提供することはオプションですが、それをプラグインのreadmeに入れて、ユーザーがa)それを理解する、またはb)何かできるようになることを期待することはできませんそれ。
EAMann

apache2-mpm-preforkは、このような使用法を処理できるようには設計されていません。memcached、APCなどを必要とするプラグインがあるため、これにはイベントベースのWebサーバーのみが必要です。これはバックエンドの要件であり、mpm-preforkであり、mpm-workerはこのためではありません。
petermolnar

1

別の潜在的な解決策は、サードパーティのWebソケットプロバイダーを使用することです。Pusher(http://pusher.com/)で少し遊んでみましたが、利用できるAPIがあります。しようとしている。私は自分のWordPressサイトでそれをどのように利用できるかを考えてきました。

考えられる欠点は、プラグインを使用しようとする他の人もプッシャーアカウントを取得して機能させる必要があることです。独自のWeb Socketsサーバーをインストールして保守するよりも、作業がはるかに簡単です。これは、実際にプラグインを使用しようとする他の人にとっては利点になります。


0

簡単な答えは、はい、できます。ただし、ホストしている単一障害点VPSよりも少し分散したものを検討する場合があります。いくつかの負荷分散されたEC2システムなどを調べてください。(このような利便性を提供するための収入源があると仮定しています。grin


1
「このような利便性を提供する収益ストリーム」...それはいいだろう:-)
EAMann
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.