PHP的Socket服务器与node.js:networking聊天

我想要使​​用长时间的HTTP请求(Comet),ajax和websockets(取决于使用的浏览器)来编写HTTP WebChat。 用户数据库是在MySQL中。 聊天是用PHP编写的,除了也可以用javascript(node.js)写的聊天stream本身:

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

据我所知,在单个php进程(套接字服务器)中,无法同时处理多个连接,但是您可以接受大量的套接字连接,并在循环中连续处理它们(读取和写入;传入消息 – >写入所有套接字连接)。 问题是,最有可能是一个滞后的约1000用户和MySQL操作可以放慢整个事情,这将影响所有的用户。

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

我也可以在每个聊天室产生一个php进程(用户less得多),但是afaik有单线程的IRC服务器,它们也能够处理成千上万的用户。 (用C ++或其他)写的,所以也许这也可能在PHP中。

我宁愿使用PHP,而不使用Node.js,因为那样的话,这个项目将只是php而不是编程语言的混合体。 但是,如果节点可以同时处理连接,我可能会select它。

JavaScript,或者在这种情况下,V8是Node所使用的引擎,是单线程devise的 。 所以是的,只有一个事件队列。

但最终,这不是问题,除非你使用多个处理器,否则总是会先发生,而且即使这样,你也很可能只有一个网卡……一个路由器……你明白了。 此外,使用1000多个线程…不是一个好主意,严重缩小,你会发现自己在一个并发的地狱

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

我可以给你一个非常基本的想法,你将如何设置它,这个普通的香草聊天thingy作品telnet,它有..没有function,但它的工作原理:

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); 

这里没有什么魔法(除了使用闭包 ),你不必使用原始套接字编程,也不会有任何并发​​问题。 而且你会学到一些最新的热点;)

我build议您看一下Node.js标记wiki上列出的一些会谈,以更好地掌握Node.js的工作原理。

另一个话题,我回答可以帮助你,并将轻松扩展到您的需求=> 如何使用redis的PUBLISH / SUBSCRIBE与nodejs通知客户端,当数据值改变?