Я хотел внедрить веб-сокеты в сложную веб-систему для правильной синхронизации данных. Идея заключалась в том, что все клиенты могут делать ajax-вызовы, php обрабатывает эти вызовы, могут редактировать данные в базе данных, и в случае успеха php-сервер отправляет некоторые данные на websocket-сервер. Затем этот сервер веб-сокетов отправляет данные всем подписанным клиентам, которые могут быть заинтересованы в данных.
Пока клиенты могут подписаться на сервер websocket (socket.io), но я не могу понять, как заставить php отправлять сообщения на сервер websocket.
Пока мой сервер веб-сокетов выглядит так:
const fs = require('fs');
const credentials = {
key: fs.readFileSync('C:/xampp/apache/conf/ssl.key/server.key'),
cert: fs.readFileSync('C:/xampp/apache/conf/ssl.crt/server.crt')
};
const app = require('express')();
// var server = require('https').Server(app);
let server = require('https').createServer(credentials, app);
let io = require('socket.io')(server);
server.listen(3000);
io.sockets.on('connection', function(socket){
console.log("connected");
socket.emit('test', { hello: 'world' });
socket.on('some other event', function (data) {
console.log(data);
});
socket.on('subscribe', function(room) {
console.log('joining room', room);
socket.join(room);
});
socket.on('unsubscribe', function(room) {
console.log('leaving room', room);
socket.leave(room);
});
socket.on('send', function(data) {
console.log('sending message');
io.sockets.in(data.room).emit('message', data);
});
});
А мои php-звонки выглядят так:
require_once __DIR__.'/../vendor/autoload.php';
$dbHandler = \services\DBHandling::getInstance();
$data = [
"subscribe" => "room3",
"message" => "evacuate nuclear reactor block B !"
];
$data_string = json_encode($data);
$curl = curl_init("http://localhost");
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER,['Content-Type: application/json',
'Content-Length: ' . strlen($data_string)
]);
curl_setopt($curl,CURLOPT_PORT, 3000);
curl_setopt($curl,CURLOPT_POST,true);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl,CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl,CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_POSTFIELDS,$data_string);
$json_response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($status != 200) {
print_r([
'Error',
$status,
curl_errno($curl)
]);
}
curl_close($curl);
php-backend нужно только отправлять сообщения на сервер websocket и не нужно его получать.