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

2022-08-30 07:43:46

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

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

我没有找到任何答案,即在完整的情况下,大多数时候客户端是由节点服务器运行的,因此不适用于我的情况。所以我抓取了所有可能的主题,终于找到了我的答案;我会试着分享这一点,并有一个观点,一切都很清楚。

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


答案 1

所以,首先,我把我的项目放在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 );

我们在新用户连接时注册了事件回调;每次我们收到一条消息(代表聊天消息)时,我们都会将其广播给每个连接的用户。现在,棘手的部分:客户端!这部分花了我大部分时间,因为我不知道哪个脚本包括哪个脚本能够在没有nodeServer的情况下运行 Socket.IO 代码(因为客户端页面将由Apache提供)。

但一切都已经完成。使用 npm 安装 Socket.IO 模块时,脚本在 ;在我的情况下,我们将包含在PHP页面中的脚本:/node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js

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

我会尽快更新和改进我的代码,但我认为它已经对所有很酷的东西开放了!我真的愿意接受有关此内容的建议和评论,这是这样做的好方法吗??

希望这可以帮助一些人!


答案 2

我有另一个对我来说效果很好的解决方案,但我希望有人评论它的有效性,因为我(还没有)有机会/时间在真正的服务器上测试它。

这里是 node-js 代码。我把这个代码放在一个名为nodeerserver的文件中.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页面时,它反过来调用nodeerserver.js页面,这证明了knall-object。

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

“真正的”服务器在ubuntu上运行。

我认为这是两台服务器之间通信的简洁易行的解决方案,但也许有人对此有任何评论?


推荐