2013-07-08 42 views
27

Tôi đang cố gắng triển khai các ổ cắm web trong Symfony2,cách sử dụng đúng WebSockets trong Symfony2

Tôi tìm thấy điều này http://socketo.me/ có vẻ khá tốt.

Tôi dùng thử Symfony và nó hoạt động, đây chỉ là một cuộc gọi đơn giản sử dụng telnet. Nhưng tôi không biết cách tích hợp nó trong Symfony.

Tôi nghĩ rằng tôi phải tạo ra một dịch vụ nhưng tôi không biết thực sự mà loại dịch vụ và làm thế nào để gọi nó là từ khách hàng

Nhờ sự giúp đỡ của bạn.

Trả lời

32

Trước tiên, bạn nên tạo một dịch vụ. Nếu bạn muốn tiêm trình quản lý đối tượng của bạn và các phụ thuộc khác, hãy làm điều đó ở đó.

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

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

Và trong 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 ... 

Tiếp theo, tạo ra một giao diện điều khiển lệnh để chạy máy chủ.

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

Bây giờ bạn có một lớp Trò chuyện với tiêm phụ thuộc, và bạn có thể chạy các máy chủ như là một lệnh console. Hi vọng điêu nay co ich!

+0

Cảm ơn câu trả lời của bạn, nó phù hợp với tôi. – Ajouve

+0

Bất kỳ ý tưởng nào về cách chạy dịch vụ này trên một dịch vụ lưu trữ php trung bình? Tôi không nghĩ rằng nó có thể chỉ cần mở một cổng như vậy, cũng không có một quá trình chạy trong thời gian dài (có thể với một crontab hack?) – Jens

+1

Tôi không biết về việc không thể sử dụng một cổng trên của bạn Dịch vụ lưu trữ. Âm thanh như một cái gì đó bạn cần phải nói chuyện với nhà cung cấp của bạn về! Bạn có thể xem câu trả lời này http://stackoverflow.com/questions/17696344/starting-a-websockets-server-in-php-on-shared-hosting/17705521#17705521 làm ví dụ về cách chạy máy chủ của bạn như một daemon bằng cách sử dụng php. Nhưng nếu bạn đang sử dụng symfony, tôi sẽ sử dụng thành phần Process chứ không phải popen và passthru. Nếu bạn muốn đặt câu hỏi, tôi có thể cho bạn thấy mã tôi sẽ sử dụng. – mattexx

Các vấn đề liên quan