设置http标头时丢失会话数据(在CodeIgniter中)

时间:2011-03-22 21:22:09

标签: php mysql session codeigniter http-headers

编辑#2
好吧,问题与我原先的想法不同,所以我把这个'编辑'放在首位。我还更新了问题标题(旧标题是'来自mysql blob的流式传输音频')。

现在问题似乎与CodeIgniter会话有关。上述脚本仅在用户登录时才会运行。出于某种原因,当我手动设置响应头时(或者 使用php的header()或codeigniters输出类)我可以从我的日志中看到所有内容都被重新加载并重新启动 - 并且会话数据丢失,因此用户不再登录,因此脚本实际上输出了错误。

一旦我删除了对会话数据的任何要求或引用,音频就可以正常运行......但除非我能够设法以其他方式验证用户,否则这不是一个真正的选择。非常令人沮丧。



** 原始文字 **

我有一个mysql blob,其中包含wav格式的音频数据。我正在尝试将其输出到浏览器以流式传输浏览器想要使用的任何音频播放器插件。

如果我将它指向物理.wav文件,音频播放器工作正常,这似乎不是问题。但是,如果我将它指向我的PHP脚本,我会在Firefox中找到“搜索合适的插件?”弹出窗口(找不到任何内容),而Chrome中只有一个空的非活动播放器。

这是PHP, $ aud 对象包含从数据库中检索的信息:

header("Content-length: $aud->size");
header("Content-type: audio/x-wav");
echo $aud->recording;
exit();

如果我将标题(“Content-Disposition:attachment; filename = $ name”); 添加到上面,我可以下载该文件,然后在外部音频播放器中正常播放,但是这不是我想要的。

这个snippit是CodeIgniter应用程序的一部分,如果这会产生影响。我设置了路由,以便/audio/$id.wav将获取适当的数据并使用上面的代码输出。

任何人都可以看到或想到上面可能无效的任何原因吗?

修改
这些是php脚本返回的标头:

Date: Tue, 22 Mar 2011 22:12:06 GMT
Server: Apache/2.2.16 (Ubuntu)
X-Powered-By: PHP/5.3.3-1ubuntu9.3
Set-Cookie: ci_session=<long encrypted session string>; expires=Wed, 23-Mar-2011 00:12:06 GMT; path=/
Content-Length: 12345
Keep-Alive: timeout=15, max=98
Connection: Keep-Alive
Content-Type: audio/x-wav

200 OK

为了比较,当我强制下载上述音频并直接在浏览器中打开该wav文件时,会返回这些标题:

Date: Tue, 22 Mar 2011 22:10:53 GMT
Server: Apache/2.2.16 (Ubuntu)
Last-Modified: Tue, 22 Mar 2011 22:08:30 GMT
Etag: "200a83-3039-49f197bfcb380"
Accept-Ranges: bytes
Content-Length: 12345
Content-Type: audio/x-wav

200 OK

直接保存然后打开文件可以。将PHP脚本输出到浏览器不会。

2 个答案:

答案 0 :(得分:0)

我会通过比较HTTP内容长度,内容类型以及Web服务器在指向物理.wav文件时发送的所有其他标头来开始调查此问题,并在尝试打开PHP时发送标头脚本。我认为实际的内容是正确的,根据您的帖子说明如果您将文件作为附件下载,它可以使用音频播放器应用程序播放。

答案 1 :(得分:0)

尝试在其中添加此标题:

header('Content-Transfer-Encoding: binary');

看看是否有帮助。