PHP套接字服务器vs node.js:Web聊天

PHP套接字服务器vs node.js:Web聊天,php,node.js,sockets,chat,Php,Node.js,Sockets,Chat,我想使用长时间持有的HTTP请求(Comet)、ajax和WebSocket(取决于所使用的浏览器)来编写HTTP WebChat。Userdatabase在mysql中。聊天是用PHP编写的,除了聊天流本身,它也可以用javascript(node.js)编写: 我不想为每个用户启动一个php进程,因为没有好的方法在这些php孩子之间发送聊天消息。 因此,我考虑在PHP或node.js中编写一个自己的套接字服务器,它应该能够处理1000多个连接(聊天用户)。作为一名纯粹的web开发人员(php

我想使用长时间持有的HTTP请求(Comet)、ajax和WebSocket(取决于所使用的浏览器)来编写HTTP WebChat。Userdatabase在mysql中。聊天是用PHP编写的,除了聊天流本身,它也可以用javascript(node.js)编写:

我不想为每个用户启动一个php进程,因为没有好的方法在这些php孩子之间发送聊天消息。 因此,我考虑在PHP或node.js中编写一个自己的套接字服务器,它应该能够处理1000多个连接(聊天用户)。作为一名纯粹的web开发人员(php),我不太熟悉套接字,因为我通常让web服务器关心连接。聊天信息不会保存在磁盘或mysql中,而是作为阵列或对象保存在RAM中,以获得最佳速度

据我所知,在一个php进程(套接字服务器)中无法同时处理多个连接,但是您可以接受大量套接字连接,并在循环中连续处理它们(读写;传入消息->写入所有套接字连接)。问题是,很可能会有大约1000个用户的延迟,mysql操作可能会减慢整个过程,从而影响所有用户

我的问题是:node.js能否处理性能更好的套接字服务器?Node.js是基于事件的,但我不确定它是否可以同时处理多个事件(这不需要多线程吗?),或者是否只有一个事件队列。对于事件队列,它就像php:一个接一个地处理用户

我还可以为每个聊天室生成一个php进程(用户要少得多),但也有单线程IRC服务器,它们也能够处理数千个用户。(用C++编写的,或者是什么),所以PHP也有可能。
与Node.js相比,我更喜欢PHP,因为这样的话,项目将只使用PHP,而不是混合编程语言。但是,如果节点可以同时处理连接,我可能会选择它。

JavaScript,或者在本例中,节点使用的引擎V8是通过设计的。所以是的,只有一个事件队列

但最后,这不是一个问题,总有一些事情会先发生,除非你使用多个处理器,即使这样,你也很可能只有一张网卡。。。一个路由器。。。你明白了。另外,使用1000多个线程。。。这不是一个好主意,扩展性很差,您会发现自己陷入了并发地狱

1000个聊天用户,这对Node.js来说根本没有问题

我可以给你一个非常基本的想法,你将如何设置它,这个简单的香草聊天的东西在telnet上工作,它有。。没有功能,但它可以工作:

var net = require('net'); // require the net module

var users = []; // keep track of the users

// setup a new tcp socket server
net.createServer(function(socket) { // provide a callback in case a new connection gets
                                    // established, socket is the socket object

    // keep track of this users names, via use of closures
    var name = '';

    // ask the new user for a name
    socket.write('Enter a Name(max 12 chars): ');

    // register a callback on the socket for the case of incoming data
    socket.on('data', function(buffer) { // buffer is a Buffer object containing the data
        if (name !== '') {  // in case this user has a name...

            // send out his message to all the other users...
            for(var i = 0; i < users.length; i++) {
                if (users[i] !== socket) { // ...but himself
                    users[i].write(name + ': '
                                   + buffer.toString('ascii').trim()
                                   + '\r\n');
                }
            }

        // otherwise take the data and use that as a name
        } else {
            name = buffer.toString('ascii').substring(0, 12).trim().replace(/\s/g, '_');
            socket.write('> You have joined as ' + name + '\r\n');

            // push this socket to the user list
            users.push(socket);
            for(var i = 0; i < users.length; i++) {
                if (users[i] !== socket) {
                    users[i].write('> ' + name + ' has joined' + '\r\n');
                }
            }
        }
    });

    // another callback for removing the user aka socket from the list
    socket.on('end', function() {
        users.splice(users.indexOf(socket), 1);
    });

// bind the server to port 8000
}).listen(8000);
var net=require('net');//需要网络模块
var users=[];//跟踪用户
//设置新的tcp套接字服务器
createServer(函数(socket){//在获得新连接时提供回调
//已建立,套接字是套接字对象
//通过使用闭包跟踪此用户名
变量名=“”;
//向新用户询问名称
socket.write('输入名称(最多12个字符):';
//在套接字上为传入数据注册回调
on('data',function(buffer){//buffer是包含数据的缓冲区对象
如果(name!=''){//如果此用户有名称。。。
//向所有其他用户发送他的消息。。。
对于(var i=0;i您已作为'+name+'\r\n'加入);
//将此套接字推送到用户列表
用户。推(插座);
对于(var i=0;i'+name+'已加入'+'\r\n');
}
}
}
});
//用于从列表中删除用户aka套接字的另一个回调
socket.on('end',function(){
用户.拼接(用户.插座索引,1);
});
//将服务器绑定到端口8000
}).听(8000);
这里没有魔法(除了使用a),您不必使用原始套接字编程,也不会有任何并发问题。你还可以了解一些最新的热点;)


我建议您观看我们的tag wiki上列出的一些讲座,以便更好地了解Node.js的工作原理。

我回答的另一个主题可以帮助您,并且可以轻松扩展到您的需要=>

感谢您的代码。上周我用PHP编写了几乎相同的代码(甚至名称!=''部分都是相同的),所以现在我将检查它在PHP中的速度是否与node.js一样快,这样我就不需要用两种语言编写bug,尽管node.js很好,也很容易,因为我多年来一直使用它编写客户端脚本(jquery等)。@Eliasdx你认为node.js与PHP相比都是基准测试吗?我很好奇结果会是什么。@Eliasdx有什么消息吗?我期待着创建一个聊天自己,非常有兴趣知道你的发现。我个人更喜欢PHP。