【发布时间】:2011-11-21 11:30:15
【问题描述】:
我有一个 download.php 脚本,它检测用户是否使用 $_SESSION 变量登录,并向用户读出一个视频文件。如果我从 Safari 5.0.5 中的元素调用它,脚本会检测到会话变量并按预期工作。在 5.1 中,download.php 不会读取会话变量,并且它的行为就像用户没有登录一样。如果我直接从地址栏调用脚本,它就可以正常工作。如果我从我的 iPhone 打电话,它也会被检测到。有谁知道这是一个错误还是有解决方法?我将不得不重新编写很多内容来尝试不使用会话。谢谢。
这是一个故障排除脚本。这显示了正确的会话数据:
<?php
session_start();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Test</title>
</head>
<body>
<video width="640" height="480" controls="true" autoplay="false" id="v">
<source src="video.php" type="video/mp4" />
</video>
<?php
echo "<pre>";
var_dump($_SESSION);
echo "</pre>";
?>
</body>
</html>
每次我加载上述页面时都会写入“未检测到会话”,但使用 Safari 5.0.5 和 iOS 检测到会话:
<?php
session_start();
// write local error log
function write_log($txt) {
$myFile = 'error.log';
$fh = fopen($myFile, 'a') or die("can't open file");
fwrite($fh, "$txt\n");
fclose($fh);
}
if ($_SESSION) {
write_log(date('Y-m-d H:i:s'). ' Session Detected');
} else {
write_log(date('Y-m-d H:i:s'). ' Session Not Detected');
}
?>
编辑:Safari Inspector 将调用 video.php 的状态显示为“待处理”,并且除了请求 url 之外没有任何标题。 修复了 session_start,但仍然可以正常工作。
编辑:好的,如果我读取 SERVER 变量,5.1 和 5.0.5 之间的区别在于 5.0.5 具有:HTTP_CONNECTION => 关闭,并且 HTTP_COOKIE 包含 PHPSESSID
编辑:我在 32 位模式下运行 Safari,它又可以工作了......
【问题讨论】:
-
您能否使用 Safari 开发者工具查看 Safari 在请求 video.php 时发送的 HTTP 标头?请求视频时是否发送 PHP 会话 cookie?
-
至于调试:您应该查看
$_COOKIE并将$_SERVER数组转储到日志文件中。完全有可能在您的 Safari 版本中,一个插件 (Quicktime) 接管了下载视频源并且不共享浏览器 cookie 存储。 -
在session_start()之前,不能输出任何html代码。