![](/img/trans.png)
[英]How to create a handshake between PHP web server and Socket.io on node.js server?
[英]PHP Socket Server vs node.js: Web Chat
我想使用長期持有的HTTP請求(Comet),ajax和websockets(取決於所使用的瀏覽器)來編寫HTTP WebChat。 用戶數據庫在mysql中。 聊天是用PHP編寫的,除了聊天流本身,也可以用javascript(node.js)編寫:
我不想為每個用戶啟動一個php進程,因為沒有好方法在這些php子進程之間發送聊天消息。 所以我想在PHP或node.js中編寫自己的套接字服務器應該能夠處理超過1000個連接(聊天用戶)。 作為一個純粹的Web開發人員(php)我不太熟悉套接字,因為我通常讓Web服務器關心連接。 聊天消息不會保存在磁盤上或mysql中,而是保存在RAM中作為數組或對象以獲得最佳速度。
據我所知,在單個php進程(套接字服務器)中無法同時處理多個連接,但是你可以接受大量的套接字連接並在循環中連續處理它們(讀寫;傳入message - >寫入所有套接字連接)。 問題是最大可能會有〜1000個用戶的滯后,而mysql操作可能會減慢整個事情的速度,從而影響所有用戶。
我的問題是:node.js可以處理性能更好的套接字服務器嗎? Node.js是基於事件的,但我不確定它是否可以同時處理多個事件(不需要多線程嗎?)或者是否只有一個事件隊列。 使用事件隊列就像php:用戶之后處理用戶。
我還可以為每個聊天室(更少的用戶)生成一個php進程,但是afaik還有單線程的IRC服務器,它們也能夠處理數千個用戶。 (用c ++或其他語言編寫)所以也許在php中也可以。
我更喜歡PHP而不是Node.js因為那時項目將只是php而不是編程語言的混合。 但是,如果Node可以同時處理連接,我可能會選擇它。
JavaScript,或者在這種情況下,V8是Node正在使用的引擎,是設計單線程的。 所以是的,只有一個事件隊列。
但最終,這不是問題,除非你使用多個處理器,否則總會先發生一些事情,即使這樣,你很可能只有一個網卡......一個路由器......你明白了。 此外,使用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);
這里沒有任何魔法(除了使用閉包 ),你不需要處理原始套接字編程,你不會有任何並發問題。 你會學到一些最新的熱情;)
我建議你觀看我們的Node.js標簽wiki上列出的一些會談,以便更好地掌握Node.js的工作原理。
我回答的另一個主題可以幫助您,並且可以輕松擴展到您的需求=> 如何使用redis PUBLISH / SUBSCRIBE與nodejs在數據值發生變化時通知客戶端?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.