簡體   English   中英

PHP Socket Server vs node.js:Web Chat

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM