phpwebsockets yii实现

时间:2013-01-06 15:05:28

标签: php html5 yii websocket yii-extensions

我正在尝试使用php实现websocket并作为yii的扩展,以便我可以为我的Web应用程序创建一个类似通知的通知

以下链接的代码是我的出发点:

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

它在我当地的xampp中完美运作..

我尝试将其转换为Yii扩展我遵循的步骤..

  1. 我把类PHPWebSocket.php放在yii扩展名文件夹中..
  2. 我创建了一个控制器websocket和一个动作启动服务器和一个动作索引(用于聊天界面以测试上述链接中的示例)
  3. 这是代码段

    <?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的方法是正确的还是不可能这样做..

    我想使用php实现相同,因为我更喜欢使用node.js或任何其他脚本

2 个答案:

答案 0 :(得分:1)

将PHP与Apache一起使用时,对PHP的每个请求(通常)都会创建新的进程/线程。由于Web套接字是(某种程度上)永久连接,因此这些PHP请求会持续很长时间。每个进程都占用服务器上的内存。因此,我认为这是可能的,如果您一次有多个(甚至不是很多)用户在线,您的服务器可能只会崩溃或拒绝请求。

Node.js方法不同 - 每个连接不需要单独的进程,因此它可以同时处理许多活动连接。

您可以将Node.js与PHP一起使用,使用队列或其他一些通信机制连接这两者。

答案 1 :(得分:0)

以防其他人偶然发现这件事。

我一直在寻找一种方法来实现Yii应用程序的实时事件。

在上面的评论中提到了this (Yii) tutorial on HTML5 SSE。由于它似乎非常简单,如果您需要支持旧版浏览器和移动设备,这还不够。

  

浏览器支持还能在IE中运行吗? Internet Explorer和Android浏览器(所有版本)都不支持Server-Sent Events   盒子。旧版本的Firefox(&lt; 6),Chrome(&lt; 6),   Safari(&lt; 5),iOS Safari(&lt; 4)或Opera(&lt; 11)。

另一个解决方案是一个相当新的Yii node socket扩展。它基于node.js socket.io库,并使用elephant.io通过php与服务器通信。最重要的是,扩展似乎(我只使用它一个月)写得很好。它具有Linux和Windows支持,使用CLI执行命令,甚至还提供了自己的数据库驱动程序。

其他解决方案仍然受欢迎。