在Symfony2

时间:2015-07-18 19:05:10

标签: php apache symfony stream streaming

我的网站存在问题。我尝试在我的网站上放一个视频流。这部分很好用。我使用此主题制作了我的代码:Symfony2 video streaming

我使用外部视频文件而非本地文件,但它可以正常工作。

但是直到视频未完全为客户端加载,我才能发出任何请求(例如,发表评论或转到其他页面(即使该操作会中断流式传输到另一个页面) )。我尝试了stream_context_create函数,但我不明白它是如何工作的。

我不知道如何“委派”流媒体并继续导航。

请帮助我,因为客户端被阻止,直到他的视频加载完毕。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

我发现了真正的问题:它在FF上运行良好,但在Chrome中,请求保持待定状态。

我需要在我的请求中添加时间戳参数,以强制Chrome重新下载页面

主题:HTML5 video element request stay pending forever (on chrome)