2013-07-08 14 views
27

Sto cercando di implementare WebSockets in Symfony2,come utilizzare correttamente WebSockets in Symfony2

ho trovato questo http://socketo.me/ che sembra piuttosto buona.

Provo da Symfony e funziona, questa era solo una semplice chiamata che utilizzava telnet. Ma non so come integrare questo in Symfony.

penso di avere per creare un servizio, ma non so davvero che tipo di servizio e come chiamarlo dal client

Grazie per il vostro aiuto.

risposta

32

Per prima cosa è necessario creare un servizio. Se vuoi iniettare il tuo gestore di entità e altre dipendenze, fallo lì.

In src/frontend/MyBundle/Resources/config/services.yml:

services: 
    chat: 
     class: MyApp\MyBundle\Chat 
     arguments: 
      - @doctrine.orm.default_entity_manager 

E in src/frontend/MyBundle/file chat.php:

class Chat implements MessageComponentInterface { 
    /** 
    * @var \Doctrine\ORM\EntityManager 
    */ 
    protected $em; 
    /** 
    * Constructor 
    * 
    * @param \Doctrine\ORM\EntityManager $em 
    */ 
    public function __construct($em) 
    { 
     $this->em = $em; 
    } 
    // onOpen, onMessage, onClose, onError ... 

Quindi, fare una console comando per eseguire il server.

In src/frontend/MyBundle/Comando/ServerCommand.php

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; 
use Symfony\Component\Console\Input\InputInterface; 
use Symfony\Component\Console\Output\OutputInterface; 
use Ratchet\Server\IoServer; 

class ServerCommand extends ContainerAwareCommand 
{ 
    protected function configure() 
    { 
     $this 
      ->setName('chat:server') 
      ->setDescription('Start the Chat server'); 
    } 

    protected function execute(InputInterface $input, OutputInterface $output) 
    { 
     $chat = $this->getContainer()->get('chat'); 
     $server = IoServer::factory($chat, 8080); 
     $server->run(); 
    } 
} 

Ora avete una classe Chat con iniezioni di dipendenza, e si può eseguire il server come un comando di console. Spero che questo ti aiuti!

+0

Grazie per la risposta, funziona per me. – Ajouve

+0

Qualche idea su come eseguirlo su un servizio di hosting php medio? Non credo sia possibile aprire una porta come questa, né avere un processo in esecuzione per lunghi periodi di tempo (magari con un crontab hack?) – Jens

+1

Non so di non essere in grado di usare una porta sul tuo servizio di hosting. Sembra qualcosa di cui devi parlare con il tuo fornitore! Puoi guardare questa risposta http://stackoverflow.com/questions/17696344/starting-a-websockets-server-in-php-on-shared-hosting/17705521#17705521 come esempio di come eseguire il tuo server come demone usando php. Ma se stai usando symfony, userei il componente Process piuttosto che popen e passthru. Se vuoi fare la domanda, posso mostrarti il ​​codice che userò. – mattexx

Problemi correlati