Я слышал, что nodejs – лучший выбор для создания приложения чата реального времени. Поэтому я решил попробовать.
//on server side //create nodejs server var http = require('http'); var chatApp = http.createServer(function (request, response) { //create an html chat form listened by this nodejs server response.writeHead(200, {'Content-Type': 'text/html'}); response.write('<script src="http://localhost/nodejs/app/socket.io.js"></script><script src="http://localhost/nodejs/app/chat.client.js"></script><input type="text" id="message_input"><div id="chatlog"></div>'); response.end(); }).listen(8000); //create websocket protocol via socket.io var io = require('socket.io').listen(chatApp); //send data to client io.sockets.on('connection', function(socket) { socket.on('message_to_server', function(data) { io.sockets.emit("message_to_client",{ message: data["message"] }); }); }); //on client side //get data from server response var socketio = io.connect(); socketio.on("message_to_client", function(data) { document.getElementById("chatlog").innerHTML = ("<hr/>" + data['message'] + document.getElementById("chatlog").innerHTML); }); //submit and send data to server via enter key document.onkeydown = function(e){ var keyCode = (window.event) ? e.which : e.keyCode; if(keyCode == 13){ var msg = document.getElementById("message_input").value; socketio.emit("message_to_server", { message : msg}); document.getElementById("message_input").value = ''; } };
Все выглядит нормально, но php webapp intergration. Как я могу заставить его работать как часть веб-страницы php?
Как уже упоминалось в моем первоначальном комментарии, вы можете позволить вашему PHP-приложению продолжать делать то, что он делал все время, и просто использовать NodeJS для обработки сетевых подключений через сокет (через socket.io). Ниже приведен пример упрощенной структуры, которую вы могли бы использовать:
Ваша страница chat.php
или контроллер чата:
<?php // Handle /chat route // Perform any authentication with your database // Render template ?> <!-- The following HTML is rendered --> <html> <head> ... <script src="http://localhost/nodejs/app/socket.io.js"></script> <script src="http://localhost/nodejs/app/chat.client.js"></script> </head> <body> ... <input type="text" id="message_input"> <div id="chatlog"></div> ... <script> var socketio = io.connect('http://localhost:8080'); socketio.on("message_to_client", function(data) { document.getElementById("chatlog").innerHTML = ("<hr/>" + data['message'] + document.getElementById("chatlog").innerHTML); }); //submit and send data to server via enter key document.onkeydown = function(e){ var keyCode = (window.event) ? e.which : e.keyCode; if(keyCode == 13){ var msg = document.getElementById("message_input").value; socketio.emit("message_to_server", { message : msg}); document.getElementById("message_input").value = ''; } }; </script> </body> </html>
Ваше приложение NodeJS будет выглядеть следующим образом. Обратите внимание на отсутствие регулярной обработки HTTP-соединений, которую мы теперь разрешаем PHP:
//create websocket protocol via socket.io var io = require('socket.io').listen(8080); //send data to client io.sockets.on('connection', function(socket) { socket.on('message_to_server', function(data) { io.sockets.emit("message_to_client",{ message: data["message"] }); }); });
И это база, которую вы будете использовать. Как упоминалось ранее в моем комментарии, это можно расширить, чтобы добавить механизмы аутентификации с поддержкой базы данных в часть узла NodeJS сервера.