如何集成nodeJS + Socket.IO和PHP?

我最近一直在四处寻找,find一个好的方法来沟通nodeJS和PHP。 这里有一个想法:nodeJS还是一个相当新的东西,用它开发一个完整的应用程序可能有些棘手。 此外,你可能只需要为你的项目的一个模块,如实时通知,聊天,…你想用PHPpipe理所有其他的东西,因为它可能更容易为你(你可以利用现有的框架CodeIgniter或Symfony)。

我想有一个简单的解决scheme; 我不想使用cURL或第三台服务器在Apache和Node服务器之间进行通信。 我想要的是能够在简单的Javascript,客户端从节点捕捉事件。

我没有find任何答案,完整的,大部分的时间客户端运行的节点服务器,所以不适用于我的情况。 所以我抓住了所有可能的主题,最后find我的答案。 我会尽力分享这一点,并有一个清楚的地方。

希望这可以帮助一些人! ;)

所以,首先,我把我的项目放在github上,如果你想访问完整的代码: https : //github.com/jdutheil/nodePHP

这是一个非常简单的示例项目:一个networking聊天。 你只有一个作者和消息,当你按发送它保存在一个MySQL数据库。 这个想法是发送实时更新,并有一个真正的谈话。 ;)我们将使用nodeJS。

我不会谈论PHP代码,这里真的很简单,并不有趣。 我想告诉你的是如何集成你的nodeJS代码。

我使用express和Socket.IO,所以一定要用npm来安装这些模块。 然后,我们创build一个简单的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 ); 

当新用户连接时,我们注册了我们的事件callback; 每次我们收到一条消息(代表一条聊天消息),我们就会把它广播给每个连接的用户。 现在,棘手的部分:客户端! 那我带了大部分时间的部分,因为我不知道这个脚本包含了没有nodeServer的情况下能运行Socket.IO代码(因为客户端页面是由Apache服务的)。 但是一切都已经完成了。 当您使用npm安装Socket.IO模块时,脚本在/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 ); }); 

我会尽快更新和改进我的代码,但我认为它已经开放给所有的很酷的东西! 我真的很乐意为这个东西提供build议和评论,这是做这件事的好方法,..?

希望这可以帮助一些人!

我还有另一种解决scheme,对我来说效果不错,但是我希望有人评论一下它的有效性,因为我还没有机会/时间在真实的服务器上进行testing。

这里是node-js代码。 我把这段代码放在一个名为nodeserver.js的文件中:

 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中的简单代码,在file_get_contents()的帮助下调用node-js服务器:

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

很好的工作,当我加载的PHP页面,它反过来调用nodeserver.js页面,这jsonify knall对象。

我有两个本地主机安装在Windows 10上运行iis,一个标准的php服务器,nodejs服务器与整洁的iisnode包一起工作。

真正的服务器在Ubuntu上运行。

我认为这是一个两个服务器之间通信的简单易用的解决scheme,但也许有人对此有任何意见?