Отправить сообщение из PHP напрямую в Node, используя только сокет (без Redis и т. Д.) - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть соединение между PHP и Node с использованием Redis, работающее нормально, но я заинтригован, делая это без каких-либо внешних библиотек и сервисов и просто с сокетами.

Я не уверен, сколько производительностибудет страдать без Redis в середине, но для более простых проектов это было бы хорошо с меньшим кодом.

Я получил большую часть кода от этот ответ в Использование PHP сSocket.io но мне пришлось поменять некоторые из переменных.Но он работает не так, как ожидалось.

Я пробовал как с https, так и без него, поскольку я буду использовать https, но я попытался сделать более простой пример с http, чтобы он работал.

  • send.php создает и пишет в сокет.Я могу подтвердить, что он подключается к узлу, так как я получаю ошибку, если узел не работает.
  • socket.js ничего не возвращает в console.logs.
  • socket-https.js возвращает соединение от :: ffff: 127.0.0.1 , но не читает socket.on ('data').Что я пропустил?

Мне кажется, я что-то неправильно понял в разделе var / require в http-версии.

Может кто-нибудь определить, почему он не работает?

socket.js

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

var listener = app.listen(8080, function(){
    console.log('Listening on port ' + listener.address().port); 
});

http.on("connection", function(socket) {
    console.log("connection");
    if(socket.remoteAddress == "::ffff:127.0.0.1") {
        console.log("connection from " + socket.remoteAddress);
        socket.on('data', function(buf) {
            var js = JSON.parse(buf);
            console.log("on data: " + js); // Not working
        });
    }
});

socket-https.js

var fs = require('fs');
var privateKey  = fs.readFileSync('my-domain-com.key', 'utf8');
var certificate = fs.readFileSync('my-domain-com.crt', 'utf8');
var credentials = {key: privateKey, cert: certificate};
var app = require('express')();
var https = require('https').createServer(credentials, app);
var io = require('socket.io')(https);

https.listen(8080, function(){
  console.log('Server online');
});

https.on("connection", function(socket) {
    console.log("connection"); // Works!
    if(socket.remoteAddress == "::ffff:127.0.0.1") {
        console.log("connection from " + socket.remoteAddress); // Works!
        socket.on('data', function(buf) {
            var js = JSON.parse(buf);
            console.log("on data: " + js); // Not working :(
        });
    }
});

send.php

sio_message("Message","Data");

function sio_message($message, $data) {
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    $result = socket_connect($socket, '127.0.0.1', 8080);
    if(!$result) {
        die('cannot connect '.socket_strerror(socket_last_error()).PHP_EOL);
    } else {
        echo "Connected<br>";
    }
    $bytes = socket_write($socket, json_encode(Array("msg" => $message, "data" => $data)));
    echo " $bytes bytes written";
    socket_close($socket);
}

Ответы [ 2 ]

0 голосов
/ 06 августа 2019

Возможно, это не имеет никакого отношения к проблеме, но мне пришлось настроить Apache для обработки условия перезаписи (я запускаю Apache и Node.js рядом)

Я понялЯ бы поставил здесь код на случай, если он кому-нибудь поможет.

В httpd.conf я добавил следующий код:

RewriteEngine On
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule .* ws://localhost:8080%{REQUEST_URI} [P]

ProxyRequests Off
ProxyPass        /socket.io http://localhost:8080/socket.io retry=0
ProxyPassReverse /socket.io http://localhost:8080/socket.io retry=0

ProxyPass "/node" "http://localhost:8080/"

Может быть, это не так?Я не уверен - также / узел становится прямой ссылкой на сервер node.js.

0 голосов
/ 09 декабря 2018

Попробуйте:

var fs = require('fs');
var privateKey  = fs.readFileSync('my-domain-com.key', 'utf8');
var certificate = fs.readFileSync('my-domain-com.crt', 'utf8');
var credentials = {key: privateKey, cert: certificate};
var app = require('express')();
var https = require('https').createServer(credentials, app);
var io = require('socket.io')(https);

https.listen(8080, function(){
  console.log('Server online');
});

io.on("connection", function(client) {
    client.on('join', function(data) {

        io.emit('message',{sendto: all, message: 'Hello there! Welcome!'});

    });
    client.on('message', function(data) {
        console.log(data);

        //forward this message to specific user
        io.emit('message',data);
    });
});

PHP скрипт:

$message = json_encode(Array("msg" => $message, "data" => $data));
$msg_length = strlen($message);
$bytes = socket_write($socket, $message, $msg_length);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...