在我的 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 没有怀疑。