Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 聊天室网络应用_Php_Javascript_Yii_Angularjs - Fatal编程技术网

Php 聊天室网络应用

Php 聊天室网络应用,php,javascript,yii,angularjs,Php,Javascript,Yii,Angularjs,我是Angular的初学者,正在尝试构建一个聊天室应用程序,以此来教会自己如何在框架中开发 我在后端使用PHP和Yii将RESTful数据发送回angular应用程序。我知道我可以使用NodeJS,但没有足够的经验,希望先学习 在我的应用程序的ChatCtrl中,有一个名为longPoll()的方法,它向服务器发出如下请求: $scope.longPoll = function (opts) { opts = opts || { lastMessageTime: '',

我是Angular的初学者,正在尝试构建一个聊天室应用程序,以此来教会自己如何在框架中开发

我在后端使用PHP和Yii将RESTful数据发送回angular应用程序。我知道我可以使用NodeJS,但没有足够的经验,希望先学习

在我的应用程序的ChatCtrl中,有一个名为longPoll()的方法,它向服务器发出如下请求:

$scope.longPoll = function (opts) {
    opts = opts || {
        lastMessageTime: '',
        lastSessionTime: ''
    };

    var params = '?lastMessageTime=' + opts.lastMessageTime +
        '&lastSessionTime=' + opts.lastSessionTime;

    // start up polling
    $http.get('/chat/poll' + params).success(function (res) {

        var user = res.items.user,
            message = res.items.message;

        // check session updates =========================================
        if (user) {
            if (user.totalCount > 0) {
                $(user.items).each(function () {
                    $scope.users[this.user_id] = this;
                });
            }
            opts.lastSessionTime = user.lastTime;
        }
        // ================================================================

        // check message updates =========================================
        if (message) {
            opts.lastMessageTime = message.lastTime;
            if (message.totalCount > 0) {
                $(message.items).each(function () {
                    $scope.messages[this.message_id] = this;
                });
            }
            opts.lastMessageTime = message.lastTime;
        }
        // ================================================================

        // loop again
        $timeout(function () { $scope.longPoll(opts); }, 1000);
    });
}
服务器每次都执行无限循环,检查更新
消息
表和
用户
表的日期是否有变化(加入会话表以确保他们已登录)

当消息或用户表发生更改时(以后可能会有更多更改),它会通过JSON向下传递记录,然后将它们添加到$scope.messages和$scope.users中,以便在HTML中查看它们:

<div ng-init="longPoll()" ng-controller="ChatCtrl">
    <ul id="nicklist" ng-cloak>
        <li id="nicklist-header">Users Online</li>
        <li ng-repeat="user in getArray(users)" ng-cloak>
            <a>
                <i class="icon-user"></i> {{user.username}}
            </a>
        </li>
    </ul>
    <ul id="messages">
        <li ng-repeat="msg in getArray(messages)" ng-model="msg" ng-cloak>
            <a class="message">
                <span class="date">[{{msg.date_added}}]</span>
                <span class="user">{{msg.username}}:</span>
                <span class="msg" ng-bind-html-unsafe="msg.message"></span>
            </a>
        </li>
    </ul>
</div>

  • 在线用户
  • {{user.username}
  • [{{msg.date_added}}] {{msg.username}}:
“getArray()”函数只是将数据转换为数组,因为我将$scope.messages和$scope.users都存储为key:value对象,以便以后可以引用它们

由于这是我第一次正确的角度应用,我相信有些事情我可以做得更好。我想知道的一件事是,当服务器发送数据更改时,如何更好地接收数据更改。我最初向服务器发出多个长轮询请求(一个用于消息,一个用于用户),但现在只有一个请求可以减少流量和服务器负载,这也意味着我无法使用Angular的$resource功能,据我所知

你能告诉我哪些方面可以改进,哪些是好的做法/坏的做法


谢谢

您可能希望将轮询逻辑移动到服务,并将事件广播到控制器

您可以通过使用Node.js+socket.io简单地实现这一点