当前位置: 首页 > 面试题库 >

从PHP发送消息到Node.js

梁建德
2023-03-14
问题内容

如何将消息从php发送到node.js?我有一个运行php和node.js的Linux服务器。

当用户完成事务(通过php)时,我想将消息从php发送到node.js。然后,节点将通过套接字连接更新客户端。

在不降低node.js性能的情况下,从php向node.js发送少量数据的好方法是什么?


问题答案:

与其他任何客户端一样,建议似乎是通过HTTP接口与节点对话。您可以使用php中的cURL通过HTTP与节点对话

请参阅:http
:
//groups.google.com/group/socket_io/browse_thread/thread/74a76896d2b72ccc/216933a076ac2595?pli=1

特别是,请参阅Matt Pardee的这篇文章

我遇到了一个类似的问题,希望让用户知道已添加到错误的新注释,以及类似的通知,这些通知实际上只能从PHP有效地发送到我的Node服务器。我所做的工作(如果发送时出现乱码且未格式化,则表示歉意,如果这样做,我很乐意将代码粘贴到其他位置):首先,您需要使用PHP中的cURL。我为此类编写了一个函数,如下所示:

function notifyNode($type, $project_id, $from_user, $data) {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, 'http://127.0.0.1');

    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
    curl_setopt($ch, CURLOPT_PORT, 8001);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);

    curl_setopt($ch, CURLOPT_POST, true);

    $pf = array('f' => $type, 'pid' => $project_id, 'user_from' =>

$from_user,
‘data’ => array());

    foreach($data as $k => $v) {
        $pf['data'][$k] = $v;
    }

    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($pf));

    curl_exec($ch);
    curl_close($ch);
}

您会注意到,由于PHP和NodeJS都在同一服务器上运行,因此我在同一服务器上发送了cURL请求,因此您的行程可能会有所不同。我将此代码设置为连接的端口是8001(这是运行Node服务器的端口,也是socket.io服务器连接的端口)。这将发送一个HTTP
POST请求,其中的post字段已编码。这些都是非常标准的cURL东西。

在您的Node应用程序中,您可能会有类似以下内容:

var server = http.createServer(function(req, res) {});
server.listen(8001);
var io = io.listen(server, { transports: ['websocket', 'flashsocket',

‘xhr-polling’] });

...

好吧,我们将在http.createServer部分上进行扩展,以侦听来自本地主机(“
127.0.0.1”)的连接。然后,createServer代码变为:

var server = http.createServer(function(req, res) {
    // Check for notices from PHP
    if(res.socket.remoteAddress == '127.0.0.1') {
        if(req.method == 'POST') {
            // The server is trying to send us an activity message

            var form = new formidable.IncomingForm();
            form.parse(req, function(err, fields, files) {

                res.writeHead(200, [[ "Content-Type", "text/plain"]
                        , ["Content-Length", 0]
                        ]);
                res.write('');
                res.end();

                //sys.puts(sys.inspect({fields: fields}, true, 4));

                handleServerNotice(fields);  
            });
        }
    }
});

从那里可以实现handleServerNotice函数。

function handleServerNotice(data) {
        ...
}

等等等等。我已经有一段时间没有对此进行测试了,实际上,代码块已在我的节点服务器上被注释掉了,所以我希望我粘贴到这里的内容能够起作用-
总的来说,这一概念已经得到证明,并且我认为它将为您工作。无论如何,只是想确保您知道已经过去了几个月,所以我不确定为什么要发表评论。我编写的代码进行了一些研究(例如在cURL中设置“
Expect:”标头),当它最终起作用时,我感到非常兴奋。让我知道您是否需要其他帮助。

最好,

马特·帕迪



 类似资料:
  • 我有一个web应用程序,它通过WebLogic中的JMS与其他Java web应用程序通信。 我读到这样的答案:如何从PHP连接Jms? 我安装了ActiveMQ并尝试使用它。但是在Weblogic中,我们需要“jms_factory”和“queue_name”。我想它使用t3协议。

  • 接口说明 轻推轻应用/订阅号支持发送文本、图片、文本卡片、图文、key-value、文件、待办等消息类型。本接口针对各种消息类型和发送的对象(单发、群发以及给部分人发送)进行了定义。 注:openid是用户关注某个轻应用/订阅号后生成的唯一id,单发和给部分人发送消息必须携带此参数,可以通过如下接口来获取: 根据qt_code获取用户基本信息 获取使用者列表 通过userId获取openid 消息

  • 主动发送消息 use EasyWeChat\Kernel\Messages\TextCard; // 获取 Messenger 实例 $messenger = $app->messenger; // 准备消息 $message = new TextCard([ 'title' => '你的请假单审批通过', 'description' => '单号:1928373, ...

  • 向已经创建连接凭据的设备发送消息数据。 请求方式: |4|2|3|message|\r 参数 message 发送的消息内容 返回值: "|4|2|3|1|\r" 发送成功 "|4|2|3|2|\r" 发送失败 Arduino样例: softSerial.print("|4|2|3|DFRobot|\r");

  • 我试图发送OSC消息(打开声音控制)从vue原生(vue包装反应原生)应用程序直接到一个叫TouchDesigner的应用程序。 我现在已经解决了这个问题,我在Android系统上从客户端应用程序向一个节点服务器发送消息,在那里我以OSC的形式转发消息,我在Touchdesigner中接收到该消息。 我想知道有没有更好的方法?基本上,我想直接向Touchdesigner应用程序发送消息,该应用程序

  • 我有一个在Payara 4.1.2.173上运行的应用程序。应用程序应该发送和接收JMS消息,因此,我使用Apache ActiveMQ Artemis。我选择ActiveMQ Artemis是因为ActiveMQ只支持JMS1.1,而ActiveMQ Artemis支持JMS2.0。 但是我觉得奇怪的是,ActiveMQ Artemis没有提供资源适配器(.rar文件),而ActiveMQ却提供