Php 浏览器:刷新时Cookie丢失

Php 浏览器:刷新时Cookie丢失,php,cookies,browser,Php,Cookies,Browser,我在Chrome浏览器中遇到了一个奇怪的应用程序行为(其他浏览器没有问题)。当我刷新页面时,cookie被正确发送,但是浏览器在某些刷新时似乎间歇性地没有传递cookie 这是我设置cookie的方式: $identifier = / some weird string /; $key = md5(uniqid(rand(), true)); $timeout = number_format(time(), 0, '.', '') + 43200; setcookie('fboxauth', $

我在Chrome浏览器中遇到了一个奇怪的应用程序行为(其他浏览器没有问题)。当我刷新页面时,cookie被正确发送,但是浏览器在某些刷新时似乎间歇性地没有传递cookie

这是我设置cookie的方式:

$identifier = / some weird string /;
$key = md5(uniqid(rand(), true));
$timeout = number_format(time(), 0, '.', '') + 43200;
setcookie('fboxauth', $identifier . ":" . $key, $timeout, "/", "fbox.mysite.com", 0);
这是我用于页面标题的内容:

header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Thu, 25 Nov 1982 08:24:00 GMT"); // Date in the past
您是否看到任何可能影响cookie处理的问题?谢谢你的建议

编辑-01: cookie似乎没有与某些请求一起发送。这种情况时有发生,我现在看到所有浏览器都有这种行为。有没有人遇到过这种情况?是否存在cookie不会随请求一起发送的情况

编辑-02: 以下是HTTP标头:

请求标题

响应标题


再次感谢您的指导。

您处理cookies的方式非常好,代码中的一切似乎都很好,问题似乎在于Chrome


虽然主要处理Java小程序,但这似乎是您正在经历的。

一个问题,一个建议-

问题-既然time()+43200应该足够了,为什么要在time()上使用数字_格式(…)


建议-您是否查看了客户端和服务器之间的时钟。由于这两台机器之间的时间差仅为12小时,如果两台机器之间存在较大的时钟偏差或GMT时间不一致,您可能会发现您发送的cookie注定将在不久的将来过期。

我以前见过类似的问题。我会仔细检查路径是否正确

我想
www.domain.com
domain.com
是不同的,就像
www.domain.com/
(带尾随的正斜杠)一样

除此之外,请检查PHP是否有权使用适当的写入权限将其会话写入文件(根据发行版的不同,它是一个不同的目录,但是
phpinfo()
应该告诉您它试图使用的目录)


我以前遇到过这两种情况。第一个没有错误,似乎模仿了您的体验,第二个给出了某种类型的文件写入访问错误,但如果没有显示错误,您可能看不到。

您的应用程序是通过http协议还是文件提供的://

Chrome不会在本地应用程序中存储cookie,这是出于设计。您可以使用命令行开关更改此行为:


--启用文件cookies

在看到您的标题信息后,我能想到的唯一一件事是,在设置cookie之前,PHP正在输出一些东西。如果是这种情况,setcookie应该返回false,您将收到一条警告“无法发送会话Cookie-标头已发送”。正如Bart S所建议的,打开
error\u reporting(E\u ALL)
并尝试输出setcookie的返回值以验证情况并非如此


另外,在基本情况下,仅使用名称和值尝试使用
setcookie
,然后再次检查响应标题。然后删掉除setcookie之外的所有代码,如果这样做有效,请使用“分而治之:”)

@Anthony:谢谢您的参考。我尝试了很多搜索,但没有找到任何与我的问题有关的Chrome问题。我想知道其他网站如何处理他们的cookie。它们在Chrome上仍然运行平稳。@Nirmal,对于参考来说没有问题。搜索有点困难,这是我唯一找到的东西。我看到他们公开悬赏,我希望有人能解决你的问题,祝你好运。谢谢你的一些想法。该站点位于内部网中,不会超出其子域。因此,这意味着它没有www或正在变化的子域。对于会话,我重新编写了PHP的会话处理,以使用数据库,它的工作没有任何缺陷。他似乎没有使用会话,因此这几乎不会影响他的示例。感谢您的回复。该站点位于内部网中,所有计算机位于同一办公室。此外,所有客户机都配置为从时间服务器自动更新时间。所以我可以说,这不是时间问题。它是通过http协议提供的。我已经检查过了所有的检查,仍然无法查出问题所在。甚至尝试重新创建整个cookie逻辑,但仍然失去了持久性。但你的是一个有用的信息。关于Chrome的文件cookie行为。谢谢。查看服务器发送的确切HTTP头会非常有帮助,并且知道您在哪个服务器/版本/php版本上运行此操作?您能否将这些详细信息与此命令的结果一起添加到问题中(前提是您在本地运行linux变体):curl-I[url\u to\u your\u app]您刚才是否尝试过
$timeout=time()+43200?@Jason:是的,我做了,但仍然是一样的。请尝试删除setcookie的路径和域,看看这是否导致了问题。另外,请尝试启用“显示错误”并将“错误报告”设置为“全部”,以查看是否有任何不太明显的错误。@James:我已经添加了HTTP信息。请看一看。顺便说一句,该网站是在一台装有PHP5.3.1.Ha的Windows机器上!我想出来了。数据库事务处理程序类在两个页面之间运行,并且在很少的情况下在加载下一个页面之前引发异常。但是,奇怪的是,即使在处理程序打印出错误后,头重定向也能无缝工作。现在我已经修复了我的db类,事情看起来很好。谢谢你的提示,这在适当的时候很有帮助!:)
Request Method:GET
Status Code:200 OK
Accept:application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Referer:http://fbox.mysite.com/dashboard
User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)
AppleWebKit/532.5 (KHTML, like Gecko)
Chrome/4.1.249.1045 Safari/532.5
Cache-Control:no-cache, must-revalidate
Content-Length:8903
Content-Type:text/html
Date:Tue, 06 Apr 2010 09:25:26 GMT
Expires:Thu, 25 Nov 1982 08:24:00 GMT
Last-Modified:Tue, 06 Apr 2010 09:25:26 GMT
Pragma:no-cache
Server:Microsoft-IIS/7.5
X-Powered-By:PHP/5.3.1 ZendServer