在我的一个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;
...
但是我在哪里查看用户身份并不重要,如果我检查它 - 视频流在Firefox中没有效果(它在text/html decoder
上抱怨)和Opera,但仍可在Chrome中使用。< / p>
如果调用了Zend_Auth hasIdentity
,我认为视频会输出一些内容。但我真的不明白:我在插件的早期做检查,只是将结果分配给一个视图属性。如果我在设置响应标头之前没有检查属性 - 一切正常。如果我检查视图属性 - 那么流已损坏,但如何?
此外,使用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不受怀疑。