Использование PHP с Socket.io - PullRequest
114 голосов
/ 19 июня 2011

Можно ли использовать Sockets.io на стороне клиента и взаимодействовать с приложением на основе PHP на сервере?Поддерживает ли PHP даже такой способ написания кода с «долгоживущим соединением»?

Весь пример кода, который я нахожу для socket.io, кажется, для node.js на стороне сервера, так что тут никакой помощи.

Ответы [ 13 ]

97 голосов
/ 18 ноября 2011

Возможно, будет немного поздно, чтобы ответить на этот вопрос, но вот что я нашел.

Я не хочу спорить о том, что узлы делают это лучше, чем php или нет, это не главное.

Решение: я не нашел никакой реализации socket.io для PHP.

Но есть несколько способов реализовать WebSockets . Существует этот плагин jQuery , позволяющий вам использовать веб-сокеты и при этом изящно деградировать для не поддерживающих браузеров. На стороне PHP существует этот класс , который представляется наиболее широко используемым для серверов PHP WS.

67 голосов
/ 18 ноября 2012

Если вы хотите использовать socket.io вместе с php, это может быть ваш ответ!

веб-сайт проекта:

elephant.io

они также находятся на github:

https://github.com/wisembly/elephant.io

Elephant.io предоставляет клиент socket.io, полностью написанный на PHP, который должен использоваться везде в вашем проекте.

Это легкая и простая в использовании библиотека, которая нацелена на предоставление некоторой функциональности в реальном времени PHPприложение через socket.io и websockets для действий, которые невозможно выполнить в полном javascript.

пример с веб-сайта проекта (связаться с сервером websocket через php)

php server

use ElephantIO\Client as Elephant;

$elephant = new Elephant('http://localhost:8000', 'socket.io', 1, false, true, true);

$elephant->init();
$elephant->send(
    ElephantIOClient::TYPE_EVENT,
    null,
    null,
    json_encode(array('name' => 'foo', 'args' => 'bar'))
);
$elephant->close();

echo 'tryin to send `bar` to the event `foo`';

сокет io server

var io = require('socket.io').listen(8000);

io.sockets.on('connection', function (socket) {
  console.log('user connected!');

  socket.on('foo', function (data) {
    console.log('here we are in action event and data is: ' + data);
  });
});
19 голосов
/ 11 августа 2014

ОБНОВЛЕНИЕ: август 2014 Текущий сайт socket.io v1.0 имеет пример PHP: - https://github.com/rase-/socket.io-php-emitter

13 голосов
/ 30 сентября 2015

Если вы действительно хотите использовать PHP в качестве бэкэнда для socket.io, вот что я нашел. Альтернатива на стороне php с двумя socket.io.

https://github.com/walkor/phpsocket.io

https://github.com/RickySu/phpsocket.io

Exmaple коды для первого хранилища, как это.

use PHPSocketIO\SocketIO;

// listen port 2021 for socket.io client
$io = new SocketIO(2021);
$io->on('connection', function($socket)use($io){
  $socket->on('chat message', function($msg)use($io){
    $io->emit('chat message', $msg);
  });
});
6 голосов
/ 22 сентября 2012

Для «долгоживущего соединения», которое вы упомянули, вы можете использовать Ratchet для PHP. Это библиотека, построенная на основе функций Stream Socket, которые PHP поддерживает с PHP 5.

Для клиентской стороны вам нужно использовать WebSocket, поддерживаемый HTML5, вместо Socket.io (поскольку, как вы знаете, socket.io работает только с node.js).

Если вы все еще хотите использовать Socket.io, вы можете попробовать это следующим образом: найти и получить socket.io.js для использования клиентом - работать с Ratchet, чтобы смоделировать способ работы socket.io на сервере

Надеюсь, это поможет!

6 голосов
/ 19 июня 2011

Хм, а зачем тебе?Оставьте PHP на бэкенде и NodeJS / Sockets, чтобы сделать его неблокирующим.

Вот кое-что, с чего можно начать: http://groups.google.com/group/socket_io/browse_thread/thread/74a76896d2b72ccc

Лично у меня есть экспресс-запуск с конечной точкой, котораяпрослушивание специально для взаимодействия с PHP.

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

Требуется взаимодействие отsocket.io to php, ну, вы можете просто сделать что-то вроде этого:

var http = require('http'),
            host = WWW_HOST,
            clen = 'userid=' + userid,
            site = http.createClient(80, host),
            request = site.request("POST", "/modules/nodeim/includes/signonuser.inc.php",  
                {'host':host,'Content-Length':clen.length,'Content-Type':'application/x-www-form-urlencoded'});                     

request.write('userid=' + userid);      
request.end();  

Серьезно, PHP отлично подходит для работы на стороне сервера, и пусть это будет с соединениями, которым он не имеет места в этом домене.Зачем что-то долго опрашивать, когда у вас есть веб-розетки или флешки?

5 голосов
/ 06 июля 2018

Я знаю, человек борьбы! Но недавно у меня было много работы с Уоркерманом. Если вы еще не наткнулись на этот php framework, то вам лучше это проверить!

Что ж, Workerman - это асинхронный PHP-фреймворк, управляемый событиями, для простого создания быстрых, масштабируемых сетевых приложений. (Я только что скопировал и вставил это с их сайта, хахахах http://www.workerman.net/en/)

Простой способ объяснить это так: когда дело доходит до программирования веб-сокетов, все, что вам действительно нужно, это иметь 2 файла на вашем сервере или локальном сервере (где бы вы ни работали).

  1. server.php (исходный код, который будет отвечать на все запросы клиента)

  2. client.php / client.html (исходный код, который будет выполнять запрашивающие действия)

В общем, сначала вы исправляете код на server.php и запускаете сервер. Обычно, поскольку я использую окна, которые добавляют больше борьбы, я запускаю сервер с помощью этой команды -> php server.php start

Хорошо, если вы используете xampp. Вот один из способов сделать это. Перейдите туда, куда вы хотите поместить свои файлы. В нашем случае мы собираемся положить файлы в

C: /xampp/htdocs/websocket/server.php

C: /xampp/htdocs/websocket/client.php или client.html

Предполагая, что у вас уже есть эти файлы на вашем локальном сервере. Откройте свой Git Bash или Командную строку или Терминал или что вы используете, и загрузите библиотеки php здесь.

https://github.com/walkor/Workerman

https://github.com/walkor/phpsocket.io

Обычно я загружаю его через composer и просто загружаю эти файлы в мои php-скрипты.

А также проверьте это. Это действительно важно ! Вам нужен этот библиотека javascript для того, чтобы client.php или client.html связывался с server.php при его запуске.

https://github.com/walkor/phpsocket.io/tree/master/examples/chat/public/socket.io-client

Я просто скопировал и вставил эту папку socket.io-client на том же уровне, что и мой server.php и мой client.php

Вот server.php исходный код

<?php
require __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;
use PHPSocketIO\SocketIO;

// listen port 2021 for socket.io client
$io = new SocketIO(2021);
$io->on('connection', function($socket)use($io){
    $socket->on('send message', function($msg)use($io){
        $io->emit('new message', $msg);
    });
});

Worker::runAll();

А вот client.php или client.html исходный код

<!DOCTYPE html>
<html>
    <head>
        <title>Chat</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">        
    </head>
    <body>
        <div id="chat-messages" style="overflow-y: scroll; height: 100px; "></div>        
        <input type="text" class="message">
    </body>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>    
    <script src="socket.io-client/socket.io.js"></script>  
    <script>
            var socket = io.connect("ws://127.0.0.1:2021");

            $('.message').on('change', function(){
                socket.emit('send message', $(this).val());
                $(this).val('');
            });

            socket.on('new message', function(data){
                $('#chat-messages').append('<p>' + data +'</p>');
            });
    </script>
</html>

Еще раз, откройте вашу командную строку или git bash или терминал, где вы положили свой файл server.php. Таким образом, в нашем случае это C: / xampp / htdocs / websocket / и введите php server.php start и нажмите enter.

Затем перейдите в браузер и введите http://localhost/websocket/client.php, чтобы посетить ваш сайт. Затем просто введите что-нибудь в это текстовое поле, и вы увидите простой php websocket на ходу!

Тебе просто нужно запомнить. В программировании веб-сокетов просто необходим сервер и клиент. Сначала запустите код сервера и откройте код клиента. И вот оно! Надеюсь, это поможет!

4 голосов
/ 26 июля 2012

Если вы действительно хотите использовать PHP в качестве бэкэнда для WebSockets, эти ссылки помогут вам в этом:

https://github.com/lemmingzshadow/php-websocket

http://www.htmlgoodies.com/html5/other/create-a-bi-directional-connection-to-a-php-server-using-html5-websockets.html#fbid=QqpDVi8FqD9

3 голосов
/ 13 января 2014

Как насчет этого? PHPSocketio ??Это альтернатива socket.io php на стороне сервера.Цикл событий основан на расширении события pecl.Хотя сам не пробовал до сих пор.

2 голосов
/ 17 ноября 2018

Сейчас у нас 2018 и hoola, есть способ реализовать WS и WAMPServer на php.Называется Храповик .

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