0

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は疑っていません。

4

0 に答える 0