wie man webSockets in Symfony2 richtig verwendet

Lesezeit: 3 Minuten

Benutzer-Avatar
Ajouve

Ich versuche Websockets in Symfony2 zu implementieren,

ich habe das gefunden http://socketo.me/ was ziemlich gut aussieht.

Ich probiere es von Symfony aus und es funktioniert, das war nur ein einfacher Anruf mit Telnet. Aber ich weiß nicht, wie ich das in Symfony integrieren soll.

Ich denke, ich muss einen Dienst erstellen, aber ich weiß nicht wirklich, welche Art von Dienst und wie ich ihn vom Client aus aufrufen soll

Danke für Ihre Hilfe.

Benutzer-Avatar
mattexx

Zuerst sollten Sie einen Dienst erstellen. Wenn Sie Ihren Entitätsmanager und andere Abhängigkeiten einfügen möchten, tun Sie dies dort.

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

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

Und in src/MyApp/MyBundle/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 ...

Führen Sie als Nächstes einen Konsolenbefehl aus, um den Server auszuführen.

In src/MyApp/MyBundle/Command/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();
    }
}

Jetzt haben Sie eine Chat-Klasse mit Abhängigkeitsinjektionen und können den Server als Konsolenbefehl ausführen. Hoffe das hilft!

  • Irgendwelche Ideen, wie man dies auf einem durchschnittlichen PHP-Hosting-Service ausführen kann? Ich glaube nicht, dass es möglich ist, einfach so einen Port zu öffnen oder einen Prozess über längere Zeit laufen zu lassen (vielleicht mit einem Crontab-Hack?)

    – Jens

    12. August 2013 um 23:17 Uhr

  • Ich weiß nicht, ob Sie einen Port Ihres Hosting-Dienstes nicht verwenden können. Klingt nach etwas, worüber Sie mit Ihrem Anbieter sprechen müssen! Sie können sich diese Antwort unter stackoverflow.com/questions/17696344/… als Beispiel ansehen, wie Sie Ihren Server mit PHP als Daemon ausführen. Aber wenn Sie Symfony verwenden, würde ich die Process-Komponente anstelle von Popen und Passthru verwenden. Wenn Sie die Frage stellen möchten, kann ich Ihnen den Code zeigen, den ich verwenden würde.

    – mattxx

    13. August 2013 um 3:24 Uhr

  • Klappt wunderbar!!! Getestet auf Symfony v2.4.2 + Ratchet v0.3.0 alles über Composer installiert. Zum Test habe ich die Callbacks mit Echos wie gefüllt echo( "onOpen" . PHP_EOL ); dann öffnete einfach ein anderes Terminal und tat a telnet 8080. Auf Anschluss bekam ich die onOpeneingeben und die Eingabetaste drücken, wird die onMessage. Ich fand es unmöglich, über zu schließen CTRL-D Also habe ich das Terminal geschlossen, das die ausgibt telnet und ich habe die onClose im SF2-Terminal.

    – Xavi Montero

    29. März 2014 um 23:07 Uhr


  • Interessanterweise führt die Verwendung von Doktrin mit einem Ratchet-Server meistens zu einem „MySQL-Server ist verschwunden“-Fehler. Tatsächlich schließt der MySQL-Server die Verbindung standardmäßig nach 8 Stunden und Doctrine verbindet sich nicht automatisch wieder mit dem Server, Sie müssen dies manuell handhaben (siehe stackoverflow.com/a/26791224/738091).

    – Gildas

    2. Februar 2015 um 17:04 Uhr

1158720cookie-checkwie man webSockets in Symfony2 richtig verwendet

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy