Intereting Posts
Paypal перенаправляет на успех после оплаты, не добавляя его в базу данных. Анонимная функция для метода объекта Скрыть текст «Корабль в другой адрес?» И флажок в Woocommerce checkout Как передать переменную JS в php? Поместить массив в WHERE -clause в PHP без нажатия X раз Postgres Отправка ответа API API OAuth2 на контроллер Laravel: выполнение некоторых задач при каждой вставке / обновлении при использовании Query Builder или Eloquent ORM Использование php для интерпретации сообщения из параллельного порта php set_time_limit менее одной секунды Замена обратных косых черт косой чертой с помощью str_replace () в php Как эффективно создавать классы объектов при работе с табличными объединениями? Эффективный алгоритм генерации расписания SQL Как защитить PDF с помощью имени пользователя и пароля? Что означает доходность в PHP? Использование _FILES Не удается отправить файл на PHP-сервер

Веб-узлы с PHP и Node.js

Возможно ли, чтобы PHP-скрипты отправляли данные через сервер Node.js через websockets?

Я планирую сторонний проект, который будет иметь скрипты PHP, работающие в фоновом режиме, работающие с некоторой магией, и приложение для конечных пользователей, которое конечные пользователи будут использовать, будет в Node.js. Было бы какое-то взаимодействие socket.io только в Node.js, но мне бы хотелось, чтобы данные были переданы в socket.io из PHP-скриптов.

Я также работаю над этим. Моя реализация немного отличается от других. Большинство людей используют php & curl + nodejs & express & socketio

Я сделал это следующим образом:

  • memcache как в php, так и в nodejs (для совместного использования идентификаторов пользователей и файлов cookie) (вы также можете использовать redis)
  • пользовательский класс PHP для отправки запроса через websocket на localhost, где сервер nodejs транслируется в комнату пользователя (все сеансы от одного и того же пользователя).

Вот класс, который я использовал для связи от php до socketio (отправляет только данные nodejs, а не наоборот)!

Когда я подключаюсь к socket.io, мой скрипт читает мой php-файл cookie и отправляет его на сервер узла, где он обращается к сеансам memcache json и идентифицирует пользователя, присоединяя его к комнате.

Вот класс обработчика сеанса memcached с php json-serialized. Он похож на тот, который я использовал.

Чтобы сделать запрос в php -> socket.io, выполните следующие действия:

 $s = new SocketIO('127.0.0.1', 8088); $adata = "On the other hand, we denounce with righteous indignation and dislike men who are so beguiled and demoralized by the charms of pleasure of the moment, so blinded by desire, that they cannot foresee the pain and trouble that are bound to ensue; and equal blame belongs to those who fail in their duty through weakness of will, which is the same as saying through shrinking from toil and pain."; $msg = json_encode(array('event'=> 'passdata','data'=> $adata, 'to'=> 1)); $tr = 0; $fl = 0; for ($i = 0 ; $i < 1000; $i++) { $s->send( 'broadcast', $msg ) ? $tr++ : $fl++; } echo "HIT : " . $tr . PHP_EOL; echo "MISS: " . $fl; 

Когда запрос (socket.io) с localhost отправляется на сервер, я запускаю этот код:

 var is_local = (this_ip === '127.0.0.1' ? true : false); socket.on('broadcast', function(data) { if (data.length === 0 ) return; if (is_local && typeof data === 'string') { try { var j = JSON.parse(data); } catch (e) { console.log("invalid json @ broadcast".red); return false; } if (!j.hasOwnProperty('to') && !j.hasOwnProperty('event')) return false; io.to(j.to).emit(j.event, j.data); console.log('brc'.blue + ' to: ' + j.to + ' evt: ' + j.event); /** @todo remove disconnect & try to create permanent connection */ socket.disconnect(); } else { console.log('brc ' + 'error'.red ); } }); 

Если я хочу передать данные с узла на php, я просто исполняю php-код на моем сервере nodejs. как это:

  socket.on('php', function(func, data, callback) { /* some functions */ if (check_usr(session) === false) return; console.log('php'.green + ' act:' + func); var cmd = 'php -r \'$_COOKIE["MONSTER"]="' + session + '"; require(\"' + __dirname + '/' + php_[func].exec + '\");\''; console.log(cmd); cp.exec(cmd , function(err, stdout, stderr) { if (err == null) { console.log(typeof callback); console.log(JSON.parse(callback)); if (callback != null) callback(stdout); console.log(stdout); //socket.emit('php', {uid: uid, o: stdout}); console.log('emitted'); } else { console.log('err '.red + stdout + ' ' + stderr); } }); }); 

Ответ да, но точная реализация зависит от вашей среды / требований.

Вот один из примеров, который я взломал из недавнего проекта: он отправляет сообщение, а затем ожидает ответа на завершение в chr (10) («\ n»). Этот ответ должен быть получен в течение 0,5 секунд, в противном случае он принимает отказ (см. Схему синхронизации). Вы можете поиграть с этими битами по мере необходимости.

Примечание. Необходимо передать $ ip и $ port.

  $retval = false; // final return value will conatin something if it all works $socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket === false || !is_resource($socket)) { $socket = false; $this->lastErrorNum = socket_last_error(); $this->lastErrorMsg = 'Unable to create socket: ' . socket_strerror(socket_last_error()); } elseif (!@socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) { $this->lastErrorNum = socket_last_error($socket); $this->lastErrorMsg = 'Unable to set options on socket: ' . socket_strerror($this->lastErrorNum); @socket_clear_error ( $socket ); } elseif (!@socket_connect($socket, $ip, $port)) { $this->lastErrorNum = socket_last_error($socket); $this->lastErrorMsg = 'Unable to connect socket: ' . socket_strerror($this->lastErrorNum); @socket_clear_error ( $socket ); } else { // Socket connected - send message if (!@socket_write($socket, $message, strlen($message))) { $this->lastErrorNum = socket_last_error($socket); $this->lastErrorMsg = 'Unable to write to socket: ' . socket_strerror($this->lastErrorNum); @socket_clear_error ( $socket ); } else { // Read a response $receiveStartTime = microtime(true); $response = ''; socket_set_nonblock ($socket); while(microtime(true) - $receiveStartTime < 0.5) { $n = @socket_recv($socket, $dataIn, 1024, 0); // Assume max return value is 1024 bytes. if ($n) { $response .= $dataIn; } if (strpos($dataIn, "\n") !== false) { @socket_clear_error ( $socket ); $response = str_replace("\n", '', $response); break; } } if (socket_last_error($socket) > 0) { $this->lastErrorNum = socket_last_error($socket); $this->lastErrorMsg = 'Unable to read from socket: ' . socket_strerror($this->lastErrorNum); @socket_clear_error ( $socket ); } else { $retval = $response; } } @socket_close($socket); }