PHP的Socket服务器与node.js:网络聊天
我想使用长时间持久的HTTP请求(Comet),ajax和websockets(取决于使用的浏览器)来编写HTTP WebChat。 用户数据库在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进程(用户少得多),但afaik有单线程IRC服务器,它们也能够处理成千上万的用户。 (用C ++或其他语言编写的),所以也许它也可以在PHP中使用。
我宁愿使用PHP而不使用Node.js,因为那时该项目将只是php而不是编程语言的混合体。 但是,如果Node可以同时处理连接,我可能会选择它。
JavaScript,或者在这种情况下,V8是Node所使用的引擎,在设计上是单线程的。 所以是的,这只是一个事件队列。
但最终,这不是问题,除非你使用多个处理器,否则总是会先发生什么事情,即使这样,你很可能只有一个网卡......一个路由器......你明白了。 另外,使用1000多个线程...并不是一个好主意,可扩展性很差,而且你会发现自己处于并发的HELL 。
1000个聊天用户,这对Node.js根本没有任何问题。
我可以给你一个非常基本的想法,你将如何设置它,这个普通的香草聊天thingy通过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()
+ 'rn');
}
}
// 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 + 'rn');
// 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' + 'rn');
}
}
}
});
// 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);
这里没有魔术(除了使用闭包),你不必使用原始套接字编程,也不会有任何并发问题。 你会学到一些最新的热点;)
我建议你看看我们的Node.js标签wiki上列出的一些会谈,以更好地了解Node.js的工作方式。
我回答的另一个话题可以帮助您,并且可以轻松满足您的需求=>如何在数据值更改时使用redis PUBLISH / SUBSCRIBE和nodejs通知客户端?
链接地址: http://www.djcxy.com/p/61285.html上一篇: PHP Socket Server vs node.js: Web Chat
下一篇: Segues initiated directly from view controllers must have an identifier