Usando PHP com Socket.io


128

É possível usar o Sockets.io no lado do cliente e se comunicar com um aplicativo baseado em PHP no servidor? O PHP ainda suporta uma maneira de 'conexão duradoura' de escrever código?

Todo o código de exemplo que encontro para socket.io parece ser para node.js no lado do servidor, portanto não há ajuda lá.


3
Possível duplicado: Socket.io da fonte php
hakre

Você pode considerar apenas o empurrador. Ele tem uma biblioteca PHP bacana que eu vou usar.
Devin G Rhode

Respostas:


98

Pode ser um pouco tarde para que esta pergunta seja respondida, mas aqui está o que eu encontrei.

Eu não quero debater sobre o fato de que nós fazem isso melhor do que php ou não, esse não é o ponto.

A solução é: Eu não encontrei nenhuma implementação do socket.io para PHP.

Mas existem algumas maneiras de implementar WebSockets . Existe esse plug-in do jQuery, permitindo que você use Websockets enquanto degrada normalmente para navegadores que não suportam. No lado do PHP, existe essa classe que parece ser a mais usada para servidores PHP WS.


1
a classe phpwebsocket é realmente o caminho a percorrer se você deseja uma implementação de servidor php websocket. No entanto, isso não está relacionado à questão. O OP já possui um servidor WS (socket.io) implementado e solicitou maneiras de se comunicar com um aplicativo php.
Kasper Taeymans

72

Se você quiser usar o socket.io junto com o php, esta pode ser sua resposta!

site do projeto:

elephant.io

eles também estão no github:

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

O Elephant.io fornece um cliente socket.io totalmente escrito em PHP que deve ser usado em qualquer lugar do seu projeto.

É uma biblioteca leve e fácil de usar que visa trazer algumas funcionalidades em tempo real a um aplicativo PHP por meio do socket.io e websockets para ações que não poderiam ser executadas em javascript completo.

exemplo no site do projeto (comunique-se com o servidor websocket através do php)

servidor 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`';

servidor de soquete 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
Vou te dar um +1 aqui, mas parece que ainda há algumas maneiras de ser utilizável em um ambiente de produção.
Beachhouse

17
Eu já vi esse, mas uma coisa me confundiu. Não é o ponto aqui para o PHP implementar um servidor sockets.io? e, em vez disso, o Elepant.io parece ser uma implementação PHP de um cliente sockets.io, para o qual você pode se conectar a outro servidor sockets.io (ou seja, o elephant.io não está escutando conexões de seus clientes sockets.io, conectando para eles e atendê-los)?
Pimp Trizkit

Exatamente o que eu procurava, pena que a conexão persistente esteja no estágio inicial de desenvolvimento.
Slezadav

8
Olá a todos. O objetivo do Elephant.io é apenas disparar eventos do PHP para um servidor socket.io. Não abrir uma conexão persistente. Mas ser capaz de conectar e enviar rapidamente eventos / mensagens. Usamos na produção e funciona como um encanto.
precisa

3
esta biblioteca não é mais mantida e tem alguns problemas para nós
Flion


14

Se você realmente deseja usar o PHP como back-end para o socket.io, aqui está o que eu encontrei. Alternativa do lado do servidor dois socket.io php.

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

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

Códigos de exemplo para o primeiro repositório como este.

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

Para 'conexão de longa duração' que você mencionou, você pode usar o Ratchet for PHP. É uma biblioteca criada com base nas funções de Stream Socket que o PHP suporta desde o PHP 5.

Para o cliente, você precisa usar o WebSocket que o HTML5 suportou em vez do Socket.io (como você sabe, o socket.io funciona apenas com o node.js).

Caso você ainda queira usar o Socket.io, tente: - encontre e obtenha o socket.io.js para o cliente usar - trabalhe com o Ratchet para simular a maneira como o socket.io faz no servidor

Espero que isto ajude!


6

Erm, por que você quer? Deixe o PHP no back-end e o NodeJS / Sockets para fazer sua coisa sem bloqueio.

Aqui está algo para você começar: http://groups.google.com/group/socket_io/browse_thread/thread/74a76896d2b72ccc

Pessoalmente, tenho a execução expressa com um endpoint que está ouvindo expressamente a interação do PHP.

Por exemplo, se eu enviei um email a um usuário, desejo que o socket.io exiba uma notificação em tempo real para o usuário.

Deseja interação do socket.io para o php, bem, você pode fazer algo assim:

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

Sério, o PHP é ótimo para fazer coisas do lado do servidor e deixar as conexões que não têm lugar neste domínio agora. Por que fazer alguma pesquisa longa quando você tem soquetes da web ou soquetes de flash?


32
Porque alguns de nós só são capazes de obter um host barato que permitirá apenas o uso de php e mysql.
Lanbo 24/10/11

31
Porque alguns de nós precisam trabalhar com estruturas existentes que dependem do PHP. Por exemplo, desenvolvemos e vendemos um script PHP, mas gostaríamos de melhorar o IM usando websockets, não queremos escrever todos os fallbacks que o socket.io já implementou, mas não podemos exigir o NodeJS de nossos clientes.
Purefan 31/10

3
@PaulM: Tentei alguns provedores de <$ 10 VPS e todos são realmente péssimos. Cada um deles foi muito lento, quando algo está quebrado, o suporte é horrível etc. Por outro lado, na Finlândia, não é raro obter hospedagem na web de qualidade decente (mas apenas com arquivos php / mysql / static) com assinatura adsl, sem pagar nenhum custo extra . Então, não, poder comprar VPS de baixa qualidade por US $ 5 definitivamente não é uma solução.
Olli

4
Para provedores de <$ 10 VPS, o único decente que encontrei até agora é o digitalocean.com. Mas esse é muito bom.
Aeolun

3
Eu não concordo Eu acho que uma resposta como essa é muito relevante. Alguém dizendo "você está usando errado" pode valer muito mais do que alguém ajudando você a usar errado.
Rijk

6

Eu conheço o homem da luta! Mas recentemente trabalhei com o Workerman. Se você ainda não encontrou este framework php, é melhor verificar isso!

Bem, Workerman é uma estrutura PHP assíncrona orientada a eventos para criar facilmente aplicativos de rede escaláveis ​​e rápidos. (Apenas copiei e colei isso no site hahahah http://www.workerman.net/en/ )

A maneira mais fácil de explicar isso é que, quando se trata de programação de soquetes da Web, tudo o que você realmente precisa é ter 2 arquivos em seu servidor ou servidor local (onde quer que esteja trabalhando).

  1. server.php (código fonte que responderá a todas as solicitações do cliente)

  2. client.php / client.html (código fonte que fará os itens solicitados)

Então, basicamente, você primeiro corrige o código em seu server.php e inicia o servidor. Normalmente, como eu estou usando o Windows que adiciona mais dificuldades, eu executo o servidor através deste comando -> php server.php start

Bem, se você estiver usando o xampp. Aqui está uma maneira de fazer isso. Vá para onde você deseja colocar seus arquivos. No nosso caso, vamos colocar os arquivos em

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

C: /xampp/htdocs/websocket/client.php ou client.html

Supondo que você já tenha esses arquivos no servidor local. Abra seu Git Bash ou Linha de Comando ou Terminal ou o que você estiver usando e faça o download das bibliotecas php aqui.

https://github.com/walkor/Workerman

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

Normalmente, eu baixa-o via compositor e apenas carrego esses arquivos automaticamente nos meus scripts php.

E verifique também este. Isso é realmente importante ! Você precisa dessa biblioteca javascript para que o client.php ou o client.html se comunique com o server.php ao executá-lo.

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

Acabei de copiar e colar a pasta socket.io-client no mesmo nível que meu server.php e client.php

Aqui está o código do servidor 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();

E aqui está o client.php ou client.html sourcecode

<!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>

Mais uma vez, abra sua linha de comando ou git bash ou terminal onde você coloca o arquivo server.php. Portanto, no nosso caso, é C: / xampp / htdocs / websocket / e digitado em php server.php start e pressione enter.

Em seguida, vá ao seu navegador e digite http: //localhost/websocket/client.php para visitar seu site. Em seguida, basta digitar qualquer coisa nessa caixa de texto e você verá um php websocket básico em movimento!

Você só precisa se lembrar. Na programação de soquetes da web, ele só precisa de um servidor e um cliente. Execute o código do servidor primeiro e abra o código do cliente. E aí está! Espero que isto ajude!



3

Que tal agora ? PHPSocketio ?? É uma alternativa ao servidor socket.io php. O loop de eventos é baseado na extensão de evento pecl. Embora ainda não tenha tentado isso até agora.


3

Estamos agora em 2018 e, hoola, existe uma maneira de implementar o WS e o WAMPServer no php. É chamado de catraca .




0

Eu estava procurando uma maneira realmente simples de obter o PHP para enviar uma mensagem socket.io aos clientes.

Isso não requer nenhuma biblioteca PHP adicional - apenas usa soquetes.

Em vez de tentar conectar-se à interface do websocket como muitas outras soluções, basta conectar-se ao servidor node.js e usar .on('data')para receber a mensagem.

Em seguida, socket.ioenvie-o aos clientes.

Detecte uma conexão do seu servidor PHP no Node.js da seguinte maneira:

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

Aqui está o código php incrivelmente simples - envolvi-o em uma função - você pode criar algo melhor.

Observe que essa 8080é a porta do meu servidor Node.js. Talvez você queira alterar.

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

Você pode usá-lo assim:

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

Você também pode enviar matrizes que são convertidas em json e repassadas aos clientes.

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

Essa é uma maneira útil de "confiar" que seus clientes estão recebendo mensagens legítimas do servidor.

Você também pode fazer com que o PHP repasse as atualizações do banco de dados sem que centenas de clientes consultem o banco de dados.

Eu gostaria de ter encontrado isso antes - espero que ajude! 😉


1
Boa ideia, eu estava procurando uma maneira de pular redis (se é uma boa ideia)! Há um erro de digitação no primeiro código, um ponto e vírgula depois s.remoteAddress;. No entanto, não estou conseguindo fazer funcionar. Recebo a conexão no nó, ele detecta a conexão, o remoteaddress está correto, mas s.on('data')nunca acontece, mas nada acontece. Eu s.on('msg')também tentei . Estou usando o seu código PHP exato. Estou usando https, para o servidor do nó, mas isso não deve importar?
Niclas

@ Niclas desculpe pelo erro de digitação - não posso acreditar que estava lá o tempo todo. O servidor do nó está em execução na porta 8080? Caso contrário, você precisará alterar a porta. Remote AddressNesse caso, verifique o que está sendo retornado - verifique se é o endereço de loopback / local - pode ser diferente com a configuração do servidor. Para testar, você pode remover a linhaif(s.remoteAddress == "::ffff:127.0.0.1")
user1274820

Obrigado pela resposta rápida! Consegui com sucesso o console.log até o fim, até o remoteaddress estava certo, ele simplesmente não entra na seção s.on ('data'). Existe uma maneira de testar qual mensagem foi enviada? Releia meu comentário para ver se perdi alguma coisa. Posso começar isso como uma nova pergunta para publicar o código, mas é quase exatamente como o seu.
Niclas

Comecei isso como uma nova pergunta para facilitar a discussão em detalhes: stackoverflow.com/questions/53689391/…
Niclas
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.