2011-01-01 35 views
17

Tôi muốn lập trình WebChat HTTP bằng các yêu cầu HTTP (Comet), ajax và websockets (tùy thuộc vào trình duyệt được sử dụng). Userdatabase nằm trong mysql. Trò chuyện được viết bằng PHP ngoại trừ chính luồng trò chuyện cũng có thể được viết bằng javascript (node.js):PHP Socket Server vs node.js: Web Chat

Tôi không muốn bắt đầu quá trình php cho mỗi người dùng vì không có cách nào tốt để gửi trò chuyện thông điệp giữa những đứa trẻ php này. Vì vậy, tôi đã nghĩ đến việc viết một máy chủ socket riêng trong cả PHP hoặc node.js để có thể xử lý nhiều hơn 1000 kết nối (người dùng trò chuyện). Là một nhà phát triển web thuần túy (php), tôi không quen thuộc với các ổ cắm vì tôi thường để máy chủ web quan tâm đến các kết nối. Các tin nhắn trò chuyện sẽ không được lưu trên đĩa cũng như trong mysql nhưng trong RAM như một mảng hoặc đối tượng cho tốc độ tốt nhất. Theo như tôi biết không có cách nào để xử lý nhiều kết nối cùng một lúc trong một quá trình php (socket server), tuy nhiên bạn có thể chấp nhận một số lượng lớn các kết nối socket và xử lý chúng liên tiếp trong một vòng lặp (đã đọc). Đọc thêm thông tin chi tiết và viết, tin nhắn gửi đến -> ghi vào tất cả các kết nối socket). Vấn đề là sẽ có nhiều khả năng là một tụt hậu với ~ 1000 người dùng và các hoạt động mysql có thể làm chậm toàn bộ điều mà sau đó sẽ ảnh hưởng đến tất cả người dùng.

Câu hỏi của tôi là: node.js có thể xử lý máy chủ socket có hiệu suất tốt hơn không? Node.js là dựa trên sự kiện nhưng tôi không chắc liệu nó có thể xử lý nhiều sự kiện cùng một lúc (không cần phải đa luồng?) Hoặc nếu chỉ có một hàng đợi sự kiện. Với hàng đợi sự kiện, nó sẽ giống như php: quá trình người dùng sau khi người dùng.

Tôi cũng có thể sinh ra một quy trình php cho mỗi phòng trò chuyện (ít người dùng hơn nhiều) nhưng có nhiều máy chủ IRC đơn lẻ cũng có khả năng xử lý hàng nghìn người dùng. (viết bằng C++ hoặc bất cứ điều gì) vì vậy có lẽ nó cũng có thể trong php.

Tôi thích PHP hơn Node.js vì sau đó dự án sẽ là chỉ php và không phải là hỗn hợp của ngôn ngữ lập trình. Tuy nhiên nếu Node có thể xử lý các kết nối đồng thời tôi có thể chọn nó.

Trả lời

24

JavaScript hoặc trong trường hợp này V8 là công cụ mà Nút đang sử dụng, là thiết kế chỉ một luồng. Vì vậy, có chỉ là một hàng đợi sự kiện.

Nhưng cuối cùng, đó là không phải là một vấn đề, điều gì đó luôn xảy ra trước, trừ khi bạn đang sử dụng nhiều bộ xử lý, và thậm chí sau đó, bạn sẽ chỉ có một thẻ mạng ... một bộ định tuyến. bạn có ý tưởng. Ngoài ra, sử dụng hơn 1000 chủ đề ... không phải là một ý tưởng tốt, quy mô xấu, và bạn sẽ thấy mình trong một đồng thời HELL.

1000 người dùng trò chuyện, sẽ là không có vấn đề gì ở tất cả cho Node.js.

tôi có thể cung cấp cho bạn một khá cơ bản ý tưởng làm thế nào bạn sẽ thiết lập nó, vani trò chuyện đơn giản này thingy hoạt động trên telnet, nó có .. không có tính năng, nhưng nó hoạt động:

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

Không có ma thuật tham gia ở đây (ngoài việc sử dụng một closures), bạn không phải làm với lập trình socket thô và bạn sẽ không có bất kỳ vấn đề tương tranh nào. Và bạn tìm hiểu một số sự nóng nhất mới nhất;)

Tôi khuyên bạn nên xem một số cuộc đàm phán được liệt kê trên wiki tag Node.js của chúng tôi để hiểu rõ hơn cách thức hoạt động của Node.js.

+0

Cảm ơn các mã. Tôi đã viết khá nhiều tuần cuối cùng trong PHP (ngay cả tên! == '' phần là giống hệt nhau), vì vậy bây giờ tôi sẽ kiểm tra xem nó có trong PHP nhanh như trong node.js vì vậy tôi không cần phải lỗi với hai ngôn ngữ mặc dù node.js là tốt đẹp và dễ dàng như tôi sử dụng nó cho kịch bản phía khách hàng trong nhiều năm nay (jquery vv). – Eliasdx

+1

@Eliasdx bạn có làm mọi node.js chuẩn vs php không? Tôi tò mò kết quả có thể là gì. – William

+0

@Eliasdx Mọi tin tức về điều này? Tôi đang tìm cách tự tạo ra một cuộc trò chuyện và rất quan tâm để biết về những phát hiện của mình. Tôi là cá nhân nhiều hơn vào PHP. –

Các vấn đề liên quan