Использование PHP с Socket.io


128

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

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


3
Возможный дубликат: Socket.io из источника php
hakre

Вы можете рассмотреть просто толкатель. В нем есть отличная библиотека PHP, которую я буду использовать.
Devin G Rhode

привет, попробуйте вот этот - github.com/walkor/phpsocket.io
Женя Христова

Ответы:


98

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

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

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

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


1
класс phpwebsocket действительно подходит, если вам нужна реализация сервера php websocket. Однако это не имеет отношения к вопросу. OP уже имеет WS-сервер (socket.io) и запрашивает способы связи с приложением php.
kasper Taeymans

72

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

сайт проекта:

elephant.io

они также есть на github:

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

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

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

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

php сервер

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 сервер

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);
  });
});

2
Я дам вам здесь +1, но похоже, что это все еще немного не пригодно для использования в производственной среде.
Beachhouse

17
Я видел это, но меня смущало одно. Разве здесь не смысл в том, чтобы PHP реализовал сервер sockets.io? и вместо этого Elepant.io кажется реализацией PHP клиента sockets.io, для которого вы можете подключиться к другому серверу sockets.io (это означает, что elephant.io не прослушивает соединения от ваших клиентов sockets.io, подключаясь к ним и их обслуживание)?
Pimp Trizkit

Как раз то, что я искал, жаль, что постоянная связь находится на ранней стадии разработки.
Слезадав

8
Всем привет. Цель Elephant.io - просто отправлять события с PHP на сервер socket.io. Не открывать постоянную связь. Но чтобы иметь возможность быстро подключаться и отправлять события / сообщения. Мы используем его в производстве, и он работает как шарм.
guillaumepotier

3
эта библиотека больше не поддерживается и вызывает у нас некоторые проблемы
Flion


15

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

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

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

Примеры таких кодов для первого репозитория.

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);
  });
});

7

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

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

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

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


6

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

Вот что вам нужно для начала: http://groups.google.com/group/socket_io/browse_thread/thread/74a76896d2b72ccc

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

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

Хотите взаимодействия с socket.io на 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 отлично подходит для работы на стороне сервера, и пусть это будет с подключениями, ему сейчас нет места в этом домене. Зачем делать длинный опрос, если у вас есть веб-сокеты или флеш-сокеты.


32
Потому что некоторые из нас могут получить только дешевый хост, который позволит вам использовать только php и mysql.
Lanbo,

31
Потому что некоторым из нас приходится работать с существующими фреймворками, которые зависят от PHP. Например, мы разрабатываем и продаем PHP-скрипт, но хотели бы улучшить IM с помощью веб-сокетов, мы не хотим писать все резервные варианты, которые уже реализованы в socket.io, но мы не можем требовать NodeJS от наших клиентов.
Purefan

3
@PaulM: Я пробовал несколько провайдеров VPS стоимостью менее 10 долларов, и все они действительно отстой. Каждый был очень медленным, когда что-то ломалось, поддержка ужасная и т. Д. С другой стороны, в Финляндии нередко можно получить веб-хостинг приличного качества (но только с php / mysql / static файлами) с подпиской на adsl, не доплачивая никаких дополнительных затрат. , Так что нет, возможность купить дрянной VPS за 5 долларов определенно не является решением.
Olli

4
Для провайдеров VPS стоимостью менее 10 долларов я пока нашел единственный достойный вариант - digitalocean.com. Но этот неплохой.
Aeolun 05

3
Я не согласен. Я думаю, что такой ответ очень важен. Тот, кто говорит вам, что «вы используете это неправильно», может стоить намного больше, чем тот, кто помогает вам использовать это неправильно.
Rijk

6

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

Что ж, 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

Обычно я загружаю его через композитор и просто автоматически загружаю эти файлы в свои скрипты 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 на ходу!

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


4

Если вы действительно хотите использовать 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


1
Позволяют ли они вам использовать socket.io (со всеми поддерживаемыми транспортами и браузерами). Или вам нужно использовать клиент, который поставляется с php-websocket?
Даррен Кук,

3

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


3

Сейчас 2018 год, и на hoola есть способ реализовать WS и WAMPServer на php. Он называется Ratchet .




0

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

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

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

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

Определите соединение с вашим 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) {
    //If connection is from our server (localhost)
    if(s.remoteAddress == "::ffff:127.0.0.1") {
        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 передавал обновления базы данных, чтобы сотни клиентов не запрашивали базу данных.

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


1
Хорошая идея, я искал способ пропустить Redis (если это хорошая идея)! В первом коде опечатка, после нее точка с запятой s.remoteAddress;. Однако я не могу заставить его работать. Я получаю соединение в узле, он обнаруживает соединение, перестановка верна, но s.on('data')никогда не происходит, но ничего не происходит. Я s.on('msg')тоже пробовал . Я использую ваш точный PHP-код. Я использую https для сервера узла, но это не имеет значения?
Никлас

@Niclas, извини за опечатку - не могу поверить, что это было все время. Ваш сервер узла работает на порту 8080? Если нет, вам нужно изменить порт. Если да, проверьте Remote Address, что возвращается - убедитесь, что это адрес обратной связи / локальный адрес - он может отличаться от настроек вашего сервера. Для тестирования можно удалить строчкуif(s.remoteAddress == "::ffff:127.0.0.1")
user1274820

Спасибо за быстрый ответ! Я успешно выполнил console.log полностью, даже удаленный был правильным, он просто не входит в раздел s.on ('data'). Есть ли способ проверить, какое сообщение было отправлено? Пожалуйста, перечитайте мой комментарий, чтобы увидеть, не упустил ли я что-то. Я мог бы начать с нового вопроса, чтобы опубликовать код, но он почти такой же, как ваш.
Никлас

Я начал это как новый вопрос, чтобы упростить подробное обсуждение: stackoverflow.com/questions/53689391/…
Никлас
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.