2

Webアプリケーションの機能のような通知を作成できるように、phpを使用してyiiの拡張機能としてwebsocketを実装しようとしています

以下のリンクのコードが私の出発点です。

http://www.flynsarmy.com/2012/02/php-websocket-chat-application-2-0/

それは私のローカルxamppで完全に動作します..

私が従ったYii拡張手順として変換してみました..

  1. クラス PHPWebSocket.php を yii 拡張フォルダーに配置しました。
  2. コントローラー websocket とアクション startserver とアクション インデックスを作成しました (上記のリンクの例をテストするためのチャット インターフェイス用)。

ここにコードスニペットがあります

<?php

Yii::import("ext.websocket.PHPWebSocket");

class WebSocketController extends Controller {

    public $layout = '//layouts/empty';

    public function actionStartServer() {

        set_time_limit(0);

        function wsOnMessage($clientID, $message, $messageLength, $binary) {
            global $Server;
            $ip = long2ip($Server->wsClients[$clientID][6]);

            // check if message length is 0
            if ($messageLength == 0) {
                $Server->wsClose($clientID);
                return;
            }

            //The speaker is the only person in the room. Don't let them feel lonely.
            if (sizeof($Server->wsClients) == 1)
                $Server->wsSend($clientID, "There isn't anyone else in the room, but I'll still listen to you. --Your Trusty Server");
            else
            //Send the message to everyone but the person who said it
                foreach ($Server->wsClients as $id => $client)
                    if ($id != $clientID)
                        $Server->wsSend($id, "Visitor $clientID ($ip) said \"$message\"");
        }

// when a client connects
        function wsOnOpen($clientID) {
            global $Server;
            $ip = long2ip($Server->wsClients[$clientID][6]);

            $Server->log("$ip ($clientID) has connected.");

            //Send a join notice to everyone but the person who joined
            foreach ($Server->wsClients as $id => $client)
                if ($id != $clientID)
                    $Server->wsSend($id, "Visitor $clientID ($ip) has joined the room.");
        }

// when a client closes or lost connection
        function wsOnClose($clientID, $status) {
            global $Server;
            $ip = long2ip($Server->wsClients[$clientID][6]);

            $Server->log("$ip ($clientID) has disconnected.");

            //Send a user left notice to everyone in the room
            foreach ($Server->wsClients as $id => $client)
                $Server->wsSend($id, "Visitor $clientID ($ip) has left the room.");
        }

        $Server = new PHPWebSocket();
        $Server->bind('message', 'wsOnMessage');
        $Server->bind('open', 'wsOnOpen');
        $Server->bind('close', 'wsOnClose');

        $Server->wsStartServer('127.0.0.1', 9300);
    }

    public function actionIndex() {
        $this->render('index');
    }

}

PHPを使用してwebsocketを作成する私のアプローチは正しいですか、それとも不可能ですか..

node.jsまたは他のスクリプトを使用することを好むため、phpのみを使用して同じことを実装したい

4

2 に答える 2

1

Apache で PHP を使用する場合、PHP への各リクエストは (通常) 新しいプロセス/スレッドを作成します。Web ソケットは (やや) 永続的な接続であるため、これらの PHP リクエストはかなりの時間持続します。各プロセスは、サーバー上のメモリを消費します。したがって、これは可能だと思いますが、一度に多くの (またはそれほど多くない) ユーザーがオンラインになると、サーバーがクラッシュしたり、要求を拒否したりする可能性があります。

Node.js のアプローチは異なります。各接続は個別のプロセスを必要としないため、多くのアクティブな接続を一度に処理できます。

キューまたはその他の通信メカニズムを使用してこれら 2 つを接続する PHP と共に Node.js を使用できます。

于 2013-01-06T15:28:26.643 に答える
0

他の誰かがこれに出くわした場合に備えて。

私は自分で Yii アプリケーションにリアルタイム イベントを実装する方法を探していました。

上記のコメントでは、HTML5 SSE に関するこの (Yii) チュートリアルが言及されています。非常に簡単に思えますが、古いブラウザーやモバイル デバイスをサポートする必要がある場合は十分ではありません。

ブラウザのサポートは IE で動作しますか? Internet Explorer および Android ブラウザー (すべてのバージョン) は、そのままでは Server-Sent Events をサポートしていません。古いバージョンの Firefox (< 6)、Chrome (< 6)、Safari (< 5)、iOS Safari (< 4)、または Opera (< 11) も同様です。

もう 1 つの解決策は、かなり新しいYii ノード ソケット拡張です。node.js socket.io ライブラリに基づいており、php を介してサーバーと通信するためにエレファント.io を使用します。何よりも、拡張機能 (私はまだ 1 か月しか使用していません) がよくできているようです。Linux と Windows の両方をサポートし、CLI を使用してコマンドを実行し、独自のデータベース ドライバーも提供されています。

他のソリューションは引き続き歓迎します。

于 2014-03-18T22:25:23.987 に答える