Zend Framework コントローラーの 1 つで、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;
...
しかし、ユーザー ID をどこで確認するかは問題ではありません。確認すれば、ビデオ ストリームは Firefox ( text/html decoder
.
Zend_AuthhasIdentity
が呼び出された場合、ビデオで何かが出力されていると思います。しかし、私は本当に理解していません.プラグインの早い段階でチェックを行い、結果をビュープロパティに割り当てるだけです. 応答ヘッダーを設定する前にプロパティをチェックしなければ、すべて問題ありません。ビューのプロパティを確認すると、ストリームが破損していますが、どうすればよいですか?
また、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は疑っていません。