Php MP3流媒体问题

Php MP3流媒体问题,php,server,streaming,mp3,exit,Php,Server,Streaming,Mp3,Exit,当我试图从本地服务器使用php流式传输音乐时,我遇到了一个非常奇怪的问题。我进行了基本的用户名/密码授权检查,以确保用户具有正确的权限来传输文件。但问题在于这些检查 如果用户没有查看文件的权限,我将使用php的exit函数中止脚本,并通过echo通知用户。退出函数似乎正在中断流,即使它没有执行 以下是我的代码的要点: function hasPermission($user,$perm) { if (!accountHasPermission($user,$per

当我试图从本地服务器使用php流式传输音乐时,我遇到了一个非常奇怪的问题。我进行了基本的用户名/密码授权检查,以确保用户具有正确的权限来传输文件。但问题在于这些检查

如果用户没有查看文件的权限,我将使用php的exit函数中止脚本,并通过echo通知用户。退出函数似乎正在中断流,即使它没有执行

以下是我的代码的要点:

    function hasPermission($user,$perm)
    {
        if (!accountHasPermission($user,$perm) )
        {
            echo "<center><a style='color:indianred'>Failed to Authenticate: 1";
            echo "<br><br><a href='javascript:history.back()'>Go Back</a>";

            exit;
        }
    }

    function streamTest()
    {
        $filename = "uploads/path_to_file";

        if(file_exists($filename)){
            header('Content-type: audio/mpeg');
            header('Content-Disposition: filename=' . basename($filename) );
            header('X-Pad: avoid browser bug');
            header('Cache-Control: no-cache');  
            readfile( $filename );
        }else{
            header("HTTP/1.0 404 Not Found");
        }
    }

    hasPermission($_POST["username"],"manageFilesWeb");

    streamTest();
    exit;
函数拥有权限($user,$perm)
{
如果(!accountHasPermission($user,$perm))
{
回声“;
出口
}
}
函数streamTest()
{
$filename=“上传/path\u到\u文件”;
如果(文件_存在($filename)){
标题(“内容类型:音频/mpeg”);
标题('Content-Disposition:filename='.basename($filename));
标题(“X-Pad:避免浏览器错误”);
标头(“缓存控制:无缓存”);
readfile($filename);
}否则{
标题(“未找到HTTP/1.0 404”);
}
}
hasPermission($_POST[“username”],“manageFilesWeb”);
streamTest();
出口
如果我在hasPermission函数中注释掉exit调用,音频流将不会出现问题。使用chrome,我得到了一个很好的音频播放器,看起来像。当然,退出函数永远不会被调用,因为我正在使用具有正确权限的帐户。这一点我百分之百肯定。如果退出功能没有被注释掉,音乐文件将不会在chrome上播放,音频播放器将看起来像。我尝试了多种chrome浏览器,结果总是一样的。但是,无论退出行是否被注释掉,音乐都将在firefox浏览器中播放

我尝试过各种其他选项,例如使用return、die、if/else,但所有这些都会给我相同的结果

我还应该注意到,我一直在对服务器上的所有其他内容使用haspmission功能,例如上传和下载文件。到目前为止,它从未给我带来任何问题。我花了几个小时的反复试验才发现退出电话可能是问题所在

我已经到了不知道发生了什么的地步。我已经不得不删除简单的if/else检查,因为它们会中断流式处理过程,但如果再删除,我将大大降低安全性

更新:我发现了问题。授权检查是问题所在。我想在文件传输过程中,_POST数据未定义,导致我的授权检查失败。有没有办法在文件流传输时获取用户名和密码以避免这种情况

  • Firefox似乎不断地发送_POST数据,从而允许验证检查通过,从而保持文件流的活动状态。而chrome似乎只发送了一次

对于此类经过身份验证的文件服务,请使用php应用程序运行的受尊敬的Web服务器的
sendfile
方法,即有两种流行的Web服务器

1。Apache

对于Apache启用mod 在这里,首先使用单独的
login.php

  // login.php
  // session_start & stop life cycle codes
  username = $_POST["username"];
  password = $_POST["password"];
  if(hasPermission(username, password){
     $_SESSION["logined"] = true; // setting a session value for successful authentication
  }
  // login success
然后为流文件添加文件php file,比如file.php

 //file.php
  if(isset($_SESSION["logined"])){
            $filename = "uploads/path_to_file"; // absolute path to file
            header('Content-type: audio/mpeg');
            header('Content-Disposition: filename=' . basename($filename) );
            header('X-Pad: avoid browser bug');
            header('Cache-Control: no-cache');  
            header('X-Sendfile', $filename);
  }else{
      header("HTTP/1.0 404 Not Found"); // or 401 Unauthorized
  }
2。Nginx


对于nginx服务器的使用,请遵循apache部分中描述的步骤,除了将
X-Sendfile
替换为
X-Accel-Redirect
,查看与nginx xsendfile相关的更多说明。

您使用的是哪台web服务器,apache与php配合使用?我将尝试一下。会话变量是否适用于试图访问服务器的任何人,或者仅适用于最初发送用户名和密码的设备?因为我可以想象,如果有人能插手我的文件流,那将是一个巨大的安全漏洞。感谢您的回复。另外,一旦文件传输完成,我想取消设置_SESSION变量,对吗?这可能吗?您只能使用会话($\u会话)控制文件访问