Socket.io из php источника - PullRequest
       19

Socket.io из php источника

5 голосов
/ 03 июня 2011

Я разработал соединение клиент-сервер, используя socket.io, и я рад сообщить, что оно работает отлично.Проблема возникает потому, что мне нужно создать это соединение из php Source (не "echo html javascript").Что-то вроде

$socket = socket.createConectionJS;

Я пробовал разные способы, такие как:

  • выполнить код с сервера (с spiderMonkey и узла)
  • создание phpSocket и подключение его к ServerSocket.j (но, очевидно, формат другой).или ...
  • Наконец-то я попробовал по почте с помощью curl, где у меня был доступ к серверному сценарию, но я не могу открыть соединение

Я думаю, чтоЕдинственный способ решить это - смоделировать соединение через веб-сокет, создав сокет тем же способом, что и класс de socket.io, но в php

Может помочь эксперт Anny socket.io?

Тнкс!! _

Ответы [ 3 ]

2 голосов
/ 23 мая 2012

Да, я быстро понял это.Мне повезло, что в PHP уже встроена довольно продвинутая библиотека для очистки веб-страниц, поэтому я просто подключил к ней XML из TamperData (плагин Firefox) и настроил несколько вещей.(мой прокси-сервер не разрешает веб-сокеты, и все равно это выглядело проще) ...

Сделайте запрос:

/socket.io/1/?t=1337779479761   

(число 13377 ... это просто временная меткаиспользуйте time () для его генерации).

Это должно вернуть что-то вроде этого:

682970926640665221:60:60:websocket,htmlfile,xhr-polling,jsonp-polling

Возьмите большое число впереди, это ваш "[CONNECT_ID]", который высохраню до конца сессии.Теперь сделайте еще один запрос:

/socket.io/1/xhr-polling/[CONNECT_ID]?t=[TIMESTAMP]

И вы получите что-то похожее на: 1

Это примерно так, насколько я потрудился следовать ему, все это выглядело довольно простым оттуда... никаких специальных заголовков или что-нибудь подлое.Предложите вам использовать TamperData или анализатор пакетов, и просто следуйте им самостоятельно.Вот вывод из моего кода:

$ php RealTestCurl.php xml/xhr.xml init1 xhr1 xhr1 xhr1 xhr1

xmlFilename: xml/xhr.xml

Step: init1
Reply: 7638339571841585529:60:60:websocket,htmlfile,xhr-polling,jsonp-polling
Found: connect_id: ([0-9]*) - 7638339571841585529

Step: xhr1
Reply: 1::

Step: xhr1
Reply: ?46?5:::{"name":"news","args":[{"hello":"world"}]}?63?5:::{"name":"this","args":[{"will":"be received by everyone"}]}

Step: xhr1
.... there is a massive 20 second timeout here

Step: xhr1
8::

Step: xhr1
8::

И на стороне node.js / socket.io, запустив основные примеры с их главной страницы:

debug - client authorized
info  - handshake authorized 3445861131360107212
debug - setting request GET /socket.io/1/xhr-polling/3445861131360107212?t=1337781185
debug - setting poll timeout
debug - client authorized for 
debug - clearing poll timeout
debug - xhr-polling writing 1::
debug - set close timeout for client 3445861131360107212
debug - websocket writing 5:::{"name":"this","args":[{"will":"be received by everyone"}]}
1 голос
/ 13 июня 2013

Мы разработали и используем в производстве Elephant.io

Мы в основном используем его в наших серверных заданиях cron для уведомления нашего фронта, а в наших API-интерфейсах Symfony2 для передачи некоторых событий вспереди.

Посмотрите, это может вам помочь.

Лучше

0 голосов
/ 16 апреля 2018

Я искал действительно простой способ заставить PHP отправлять сообщения socket.io клиентам.

Для этого не требуется никаких дополнительных библиотек PHP - просто используются сокеты.

Вместо того чтобы пытаться подключиться к интерфейсу websocket, как это делают многие другие решения, просто подключитесь к серверу node.js и используйте .on('data') для получения сообщения.

Затем socket.io может переслать его клиентам.

Я думаю, что многие из этих раздутых решений пытаются заставить PHP работать с протоколами websocket.

Зачем беспокоиться?

Определите соединение с вашим PHP-сервером в Node.js следующим образом:

//You might have something like this - just included to show object setup
var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server);

server.on("connection", function(s) {
    var ip = s.remoteAddress;
    if(ip == "::ffff:127.0.0.1") {   //If connection is from our server (localhost)
        s.on('data', function(buf) {
            var js = JSON.parse(buf);
            io.emit(js.msg,js.data); //Send the msg to socket.io clients
        });
    }
});

Вот невероятно простой код php - я обернул его в функцию - вы можете придумать что-нибудь получше.

Обратите внимание, что 8080 - это порт моего сервера Node.js - вы можете изменить его.

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);
    }
    $bytes = socket_write($socket, json_encode(Array("msg" => $message, "data" => $data)));
    socket_close($socket);
}

Вы можете использовать его так:

sio_message("chat message","Hello from PHP!");

Вы также можете отправлять массивы, которые конвертируются в json и передаются клиентам.

sio_message("DataUpdate",Array("Data1" => "something", "Data2" => "something else"));

Это полезный способ «поверить», что ваши клиенты получают законные сообщения с сервера.

PHP также может передавать обновления базы данных без сотен клиентов, запрашивающих базу данных.

Хотел бы я найти это раньше - надеюсь, это поможет! ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...