phpwebsockets yii implementation



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

下面的代码链接是我的起点:

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

它在我的本地示例中工作得很好。

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

  1. 我已经把类PHPWebSocket.php在yii扩展文件夹。
  2. 我创建了一个控制器websocket、一个动作启动服务器和一个动作索引(用于聊天界面,以测试上面链接中的示例)

下面是代码片段

<?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或任何其他脚本

在Apache中使用PHP时,每次对PHP的请求(通常)都会创建新的进程/线程。由于web套接字(在某种程度上)是永久连接,这些PHP请求会持续相当长的时间。每个进程占用服务器上的内存。所以,我认为这是可能的,如果你有很多(甚至没有那么多)用户同时在线,你的服务器可能会崩溃或拒绝请求。

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

你可以使用Node.js和PHP一起使用队列或其他通信机制连接两者

以防别人偶然发现。

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

在上面的评论中提到了HTML5 SSE教程。这看起来很简单,但如果你需要支持旧的浏览器和移动设备,这是不够的。

浏览器支持aka它在IE中工作吗? Internet Explorer和Android浏览器(所有版本)不支持服务器发送事件退出这个盒子。旧版本的Firefox (<6)、Chrome (<6),Safari (& lt;5)、iOS Safari (<4),或Opera (<11) .

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

相关内容

  • 没有找到相关文章

最新更新