Принимать запросы во время потоковой передачи в Symfony2

У меня проблема с моим сайтом. Я пытаюсь разместить потоковое видео на своем сайте. Эта часть работает хорошо. Я использовал эту тему, чтобы сделать свой код: Symfony2 потоковое видео.

Я использую внешний видеофайл, а не локальный файл, но он работает.

Но до тех пор, пока видео не будет полностью загружено для клиента, я не могу сделать ни одного запроса (например, оставить комментарий или перейти на другую страницу (даже если действие прервет потоковую передачу, чтобы перейти на другую страницу)). Я попробовал stream_context_create функционировать, но я не понимаю, как это работает.

Я не знаю, как сделать, чтобы «делегировать» потоковую передачу и продолжить навигацию.

Можете ли вы помочь мне, пожалуйста, потому что клиент заблокирован, пока его видео не будет загружено.

0

Решение

Я бы включил вашу потоковую логику в консольную команду Symfony и запустил демон с помощью сценария upstart или bash. Вы можете взаимодействовать с демоном, используя задачи в Redis или Mysql.

UPD: создать задачу в папке AppBundle / Entity:

<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table
*/
class Task
{
/**
* @ORM\Id
* @ORM\Column(type="bigint")
* @ORM\GeneratedValue(strategy="AUTO")
* @var int
*/
private $id;
/**
* @ORM\Column(type="text")
* @var string
*/
private $fileName;
/**
* @var boolean
* @ORM\Column(type="string", length=50)
*/
protected $status = 'new';
/**
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* @param string $status
*/
public function setStatus($status)
{
$this->status = $status;
}
/**
* @return string
*/
public function setStatus($status)
{
return $this->status;
}
}

Обновите схему базы данных и убедитесь, что таблица была создана:

app/console doctrine:schema:update --force

Создайте Symfony Command.

namespace AppBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

class VideoDaemonCommand extends ContainerAwareCommand
{
protected function configure()
{
$this->setName('app:video-daemon');
}

/** @var EntityManager */
private $em;

protected function execute(InputInterface $input, OutputInterface $output)
{
$this->em = $this->getContainer()->get('doctrine.orm.entity_manager');
while (true) {
$task = $this->em->getRepository('AppBundle:Task')->findOneBy(['status' => 'new']);
if (is_null($task)) {
sleep(5);
continue;
}
$this->setTaskStatus('processing', $task);
$this->processTask($task);
}
}

private function processTask($task) {
//here do streaming logic
$this->setTaskStatus('completed', $task);
}

private function setTaskStatus($status, $task) {
$task->setStatus($status);
$this->em->persist($task);
$this->em->flush();
}
}

Давайте создадим демон с помощью upstart (debian / ubuntu). Поместите следующее содержимое в /etc/init/video-daemon.conf и перезагрузите компьютер.

start on filesystem or runlevel [2345]
stop on runlevel [!2345]

### Keep the process alive, limit to 5 restarts in 60s

respawn
respawn limit 5 60

### Start daemon

script
exec /path/to/your/project/app/console app:video-daemon
end script

Проверьте, работает ли демон:

ps -aux | grep video-daemon

Теперь, если все прошло хорошо, вы можете создавать задачи в контроллерах / сервисах Symfony:

$task = new \AppBundle\Entity\Task();
$em->persist($task);
$em->flush();
0

Другие решения

Я нашел реальную проблему: он хорошо работает на FF, но в Chrome запрос остается в ожидании.

мне нужно было добавить параметр метки времени в мой запрос, чтобы заставить Chrome повторно загрузить страницу

тема: HTML5-элемент видео-запроса остается в ожидании навсегда (в Chrome)

0

По вопросам рекламы [email protected]