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

Jér*_*eil 98 php real-time node.js socket.io

我最近一直在寻找,找到一个在nodeJS和PHP之间进行通信的好方法.这是一个想法:nodeJS仍然很新,只用它来开发一个完整的应用程序可能有点棘手.此外,您可能只需要项目的一个模块,如实时通知,聊天,......您希望使用PHP管理所有其他内容,因为它可能对您来说更容易(并且您可以利用现有的框架,如CodeIgniter或Symfony).

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

我没有找到任何完整的答案,大部分时间客户端都是由节点服务器运行的,因此在我的情况下不适用.所以我抓住了所有可能的主题,最后找到了答案; 我会尝试分享这个,并指出一点都清楚.

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

Jér*_*eil 130

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

这是一个非常简单的示例项目:网络聊天.您只需要一个作者和消息,当您按下send时,它将保存在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 );
Run Code Online (Sandbox Code Playgroud)

我们在连接新用户时注册了我们的事件回调; 每次我们收到消息(代表聊天消息)时,我们都会将其广播给每个连接的用户.现在,棘手的部分:客户端!这个部分占用了我的大部分时间,因为我不知道哪个脚本包含能够在没有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>
Run Code Online (Sandbox Code Playgroud)

并完成我的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 );
});
Run Code Online (Sandbox Code Playgroud)

我会尽快更新和改进我的代码,但我认为它已经开放给所有很酷的东西!我非常乐意接受这方面的建议和评论,是不是这样做的好方法,...?

希望这可以帮助一些人!

  • 那么,当你写一个问题时,有一个选项"回答你自己的问题,分享知识问答风格",所以我想我们可以这样分享,对不起,如果我错了:) (18认同)
  • 作为建议,我认为在这里结合这个问题的答案http://stackoverflow.com/questions/5818312/mysql-with-node-js是一种更好的方法.避免任何ajax调用,并使用节点使代码更内联.现在,PHP可以简单地从数据库中选择信息. (4认同)