У меня есть соединение между 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);
}