0

在我的 Zend Framework 控制器之一中,我想通过 nginx 流式传输 mp4 视频。我的设置是这样的:

    public function streamAction() {

        $this->_helper->layout->disableLayout();
        $this->_helper->viewRenderer->setNoRender(TRUE);
        if ($this->view->user) { //<--if I skip this check - everything works fine
            $this->getResponse()
                ->setHeader('Content-Disposition', 'inline; filename=video.mp4')
                ->setHeader('X-Accel-Redirect', '/media/video/video.mp4')
                ->setHeader('Content-type', 'video/mp4')
                ->setHeader('Content-length', '2219550244')
            ;
        }
    }

早些时候在一个插件中,preDispatch我为视图设置了用户属性:

...
$view = $layout->getView();
$user = Application_Model_User::get_auth_user(); // here I check the usual Zend_Auth `hasIdentity()`
$view->user = $user;
...

text/html decoder但是我在哪里检查用户身份并不重要,如果我检查它 - 视频流在 Firefox(它抱怨)和 Opera中不起作用,但在 Chrome 中仍然有效。

hasIdentity我想如果 Zend_Auth被调用,视频会输出一些东西。但我真的不明白:我在插件中尽早进行检查,然后将结果分配给视图属性。如果我在设置响应标头之前不检查属性 - 一切正常。如果我检查视图属性 - 那么流已损坏,但如何?

另外,在使用 Zend 安全系统的情况下,是否有类似这样的视频流实践?

更新

好吧,实际上Zend_Auth不是导致腐败的原因,它的访问权限$_SESSION

...
if ($_SESSION) {
    $this->getResponse()
        ->setHeader('Content-Disposition', 'inline; filename=video.mp4')
        ->setHeader('X-Accel-Redirect', '/media/video/video.mp4')
        ->setHeader('Content-type', 'video/mp4')
        ->setHeader('Content-length', '2219550244')
    ;
}

以上也不会在 Firefox 和 Opera 中提供流。

更新 2

我已将代码简化为 4 行 php 文件:

<?php

session_start();

if (isset($_SESSION['Zend_Auth'])) { // same with $_COOKIE['PHPSESSID']
    header('Content-type: video/mp4');
    readfile('/home/user/Videos/video.mp4');
}

再次,如果我删除检查(或检查不存在的密钥,如$_SESSION['rubbish']) - 在 Firefox 中流是可以的。问题出在 php 会话中,所以 ZF 没有怀疑。

4

0 回答 0