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!
Cảm ơn câu trả lời của bạn, nó phù hợp với tôi. – Ajouve
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
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