Використання PHP з Socket.io


128

Чи можливо використовувати Sockets.io на стороні клієнта та спілкуватися з програмою на основі PHP на сервері? Чи підтримує PHP навіть такий спосіб довгострокового зв'язку?

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


3
Можливий дублікат: Socket.io з джерела php
hakre

Ви можете розглянути просто штовхача. У ньому є чудова бібліотека PHP, яку я буду використовувати.
Девін Г Род

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

Відповіді:


98

На це запитання можна відповісти трохи пізно, але ось що я знайшов.

Я не хочу дискутувати з приводу того, що вузли роблять це краще, ніж php чи ні, в цьому справа не в тому.

Рішення полягає в тому, що я не знайшов жодної реалізації socket.io для PHP.

Але є кілька способів реалізації WebSockets . Існує цей плагін jQuery, який дозволяє вам використовувати веб-розетки, при цьому вишукано принижуючи їх для непідтримуючих браузерів. З боку PHP, існує цей клас, який, як видається, є найбільш широко використовуваним для серверів PHP WS.


1
Клас phpwebsocket - це справді шлях, якщо ви хочете реалізувати сервер php websocket. Однак це не пов'язано з питанням. В ОП вже є вбудований WS-сервер (socket.io) і запитуються способи спілкування з додатком php.
kasper Taeymans

72

Якщо ви хочете використовувати socket.io разом із php, це може бути вашою відповіддю!

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

слон.io

вони також є на Github:

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

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

Це легка та проста у використанні бібліотека, яка має на меті принести деяку функціональність у режимі реального часу через PHP-додаток через socket.io та websockets для дій, які неможливо виконати у повному обсязі 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`';

socket 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, підключаючись їм та обслуговуючи їх)?
Сутенер Тризкіт

Тільки те, що я прийшов шукати, шкода, що стійкий зв’язок знаходиться на ранній стадії розвитку.
слезадів

8
Привіт всім. Elephant.io має на меті просто запустити події з PHP на сервер socket.io. Не відкривати стійке з'єднання. Але мати можливість швидко підключатися та надсилати події / повідомлення. Ми використовуємо його у виробництві, і це працює як шарм.
guillaumepotier

3
ця бібліотека більше не підтримується і має деякі проблеми для нас
Фліон


14

Якщо ви дійсно хочете використовувати 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.
Ланбо

31
Тому що деяким з нас доводиться працювати з існуючими рамками, які залежать від PHP. Наприклад, ми розробляємо та продаємо PHP-скрипт, але хотіли б покращити чат за допомогою веб-розеток, ми не хочемо писати всі резервні копії, які socket.io вже реалізовано, але ми не можемо вимагати від NodeJS від наших клієнтів.
Пурефан

3
@PaulM: Я спробував кілька постачальників VPS <10 доларів, і всі вони справді смоктали. Кожен був дуже повільним, коли щось порушено, підтримка жахлива тощо. З іншого боку, у Фінляндії не рідкість отримати пристойну якість веб-хостингу (але лише для php / mysql / статичних файлів) з підпискою на adsl, не платячи зайвих платежів . Тож ні, можливість придбати хитрі VPS за 5 доларів, безумовно, не є рішенням.
Оллі

4
Для <10 $ VPS-провайдерів єдиний гідний, який я знайшов поки що, це digitalocean.com. Але це досить добре.
Aeolun

3
Я не згоден. Я думаю, що така відповідь є дуже актуальною. Хтось сказав вам "ви неправильно використовуєте" може коштувати набагато більше, ніж хтось допомагає вам неправильно використовувати.
Rijk

6

Я знаю людину боротьби! Але я нещодавно в ньому сильно працював з Workerman. Якщо ви не натрапили на цю рамку php, то краще перевірте це!

Ну, Workerman - це асинхронна рамка PHP, керована подіями, яка дозволяє легко створювати швидкі масштабовані мережеві програми. (Я щойно скопіював і вставив це з свого веб-сайту hahahah http://www.workerman.net/uk/ )

Найпростіший спосіб пояснити це тим, що якщо мова йде про програмування веб-сокетів, все, що вам потрібно мати, - це мати два файли на вашому сервері або на локальному сервері (де б ви не працювали).

  1. server.php (вихідний код, який відповість на всі запити клієнта)

  2. client.php / client.html (вихідний код, який виконуватиме запит)

Таким чином, ви правий код спочатку на сервері server.php і запускаєте сервер. Зазвичай, коли я використовую Windows, що додає більше зусиль, я запускаю сервер за допомогою цієї команди -> 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 потрібна для того, щоб клієнт.php або client.html спілкувався з сервером.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 ?? Це альтернатива на стороні сервера socket.io php. Цикл подій заснований на розширенні події pecl. Хоча до цього часу я сам не пробував.


3

Ми зараз у 2018 році та хула, є спосіб впровадити 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/…
Niclas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.