2013-06-20 6 views
86

Я недавно оглядывался, чтобы найти хороший способ общения между nodeJS и PHP. Вот идея: nodeJS по-прежнему довольно нова, и может показаться сложным разработать полное приложение только с ним. Более того, вам может понадобиться только один модуль вашего проекта, например, уведомления в реальном времени, чат, ... И вы хотите управлять всем остальным с помощью PHP, потому что, вероятно, вам будет легче (и вы можете воспользоваться преимуществами существующие структуры, такие как CodeIgniter или Symfony).Как интегрировать nodeJS + Socket.IO и PHP?

Я хотел бы иметь простое решение; Я не хочу использовать cURL или третий сервер для связи между серверами Apache и Node. Я хочу, чтобы улавливать события из узла в простом Javascript, на стороне клиента.

Я не нашёл ответов на них, где полная, большую часть времени клиентская сторона запускалась сервером узлов и поэтому не применима в моем случае. Поэтому я просмотрел все возможные темы и, наконец, нашел свой ответ; Я постараюсь поделиться этим, и иметь точку, где все ясно.

Надеюсь, это поможет некоторым людям! ;)

ответ

122

Итак, начнем с того, я поставил свой проект на GitHub, если вы хотите получить доступ к полному коду: https://github.com/jdutheil/nodePHP

Это очень простой пример проекта: веб-чат. У вас есть только автор и сообщение, и когда вы нажимаете отправить, он сохраняется в базе данных mysql. Идея состоит в том, чтобы отправлять обновления в реальном времени и вести настоящую беседу. ;) Мы будем использовать nodeJS для этого.

Я не буду говорить о PHP-коде, это действительно просто и не интересно здесь; я хочу показать вам, как интегрировать ваш nodeJS-код.

Я использую express и Socket.IO, поэтому не забудьте установить эти модули с номером npm. Затем мы создаем простой nodeJS-сервер:

var socket = require('socket.io'); 
var express = require('express'); 
var http = require('http'); 

var app = express(); 
var server = http.createServer(app); 

var io = socket.listen(server); 

io.sockets.on('connection', function(client) { 
    console.log("New client !"); 

    client.on('message', function(data) { 
     console.log('Message received ' + data.name + ":" + data.message); 

     io.sockets.emit('message', { name: data.name, message: data.message }); 
    }); 
}); 

server.listen(8080); 

Мы зарегистрировали обратный вызов наших событий при подключении нового пользователя; каждый раз, когда мы получаем сообщение (представляет собой сообщение чата), мы передаем его каждому подключенному пользователю. Теперь сложная часть: клиентская сторона! Это часть, которая занимала меня большую часть времени, потому что я не знал, что сценарий включает в себя возможность запуска кода Socket.IO без nodeServer (поскольку клиентская страница будет обслуживаться Apache). Но все уже сделано; когда вы устанавливаете модуль Socket.IO с номером npm, скрипт доступен в /node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js; что сценарий мы будем включать в нашей странице PHP, в моем случае:

<script src="js/node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js"></script> 
    <script src="js/nodeClient.js"></script> 

И закончить, мой nodeClient.js, где мы просто подключиться к серверу узла и ждать события, чтобы обновить нашу страницу. ;)

var socket = io.connect('http://localhost:8080'); 

$("#messageForm").submit(function() { 
    var nameVal = $("#nameInput").val(); 
    var msg = $("#messageInput").val(); 

    socket.emit('message', { name: nameVal, message: msg }); 

    // Ajax call for saving datas 
    $.ajax({ 
     url: "./ajax/insertNewMessage.php", 
     type: "POST", 
     data: { name: nameVal, message: msg }, 
     success: function(data) { 

     } 
    }); 

    return false; 
}); 

socket.on('message', function(data) { 
    var actualContent = $("#messages").html(); 
    var newMsgContent = '<li> <strong>' + data.name + '</strong> : ' + data.message + '</li>'; 
    var content = newMsgContent + actualContent; 

    $("#messages").html(content); 
}); 

Я постараюсь обновить и улучшить свой код как можно скорее, но я думаю, что это уже открыт для всех классных вещей! Я действительно открыт для консультаций и обзоров по этому поводу, это хороший способ сделать это, ..?

Надеюсь, это поможет некоторым людям!

+17

Ну, когда вы пишете вопрос, есть возможность «ответить на свой вопрос, поделиться знаниями Q & A style», поэтому я подумал, что мы можем делиться подобным образом, извините, если я ошибаюсь :) –

+1

вы правы, спасибо для привлечения моего внимания :) – wakqasahmed

+0

Привет, Jérémy, как насчет использования Redis Pub/Sub с драйвером PHP для Redis и нажатиями вещей, которые происходят в приложении PHP на канал, и в Node.js делают все, что вам нужно, слушая эти каналы? Я просто хочу знать сравнения Pub/Sub с вашим кодом. Цените свой обмен. – Maziyar

2

У меня есть еще одно решение, которое хорошо работает для меня, но мне бы хотелось, чтобы кто-то прокомментировал, насколько он эффективен, поскольку у меня еще нет возможности проверить время на реальном сервере.

Здесь приведен код node-js. Я помещаю этот код в файл, называемый nodeerver.ЯШ:

var http = require('http'); 

http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/html'}); 

    var knall = new Object(); 
    knall.totten = "4 tomtar"; 
    knall.theArr = new Array(); 
    knall.theArr.push("hoppla") 
    knall.theArr.push("hej") 
    var strKnall = JSON.stringify(knall); 

    res.end(strKnall); 
}).listen(process.env.PORT); 

А вот простой кусок кода в PHP, вызов сервера узла-JS с помощью file_get_contents():

$json = file_get_contents('http://localhost:3002/knall.json'); 
$obj = json_decode($json); 

прекрасно работает, когда я загружаю PHP- , он, в свою очередь, вызывает страницу nodeerver.js, которая jsonify knall-object.

У меня есть две локальные установки, работающие на iis на окнах 10, один стандартный php-сервер, а nodejs-сервер работает с аккуратным пакетом iisnode.

«Настоящий» сервер работает на ubuntu.

Я думаю, что это удобное и простое решение для связи между двумя серверами, но, возможно, у кого-то есть какие-либо комментарии по этому поводу?

+0

Это не имеет для меня никакого смысла, потому что вы запускаете сервер узлов из PHP-скрипта. Я не могу воплотить в этом вопрос. Нам нужен способ связи между запущенным экземпляром node.js и php. –

+0

Нет @Lorenz, то есть сценарий node.js, работающий на собственном сервере. Я вызываю node.js-страницу непосредственно из php с файлом_get_contents(), с другого php-сервера. В настоящее время он используется ежедневно с более чем 500 пользователями в день. Может быть, вы запутались, потому что «localhost: 3002»? Это связано с тем, что этот пример работает на моем локальном компьютере Windows с двумя автономными серверами в iis. – Snorvarg

+0

Я действительно смущен. Это означает, что 'nodejs.js' на самом деле ** не ** исходный файл, но это URL-адрес, который вы назвали так, потому что он содержит json? Первое не имело никакого смысла, но последнее кажется мне очень запутанным. –