0

我在使用 PHP 和会话时遇到了一种非常奇怪的行为。

我正在使用的脚本已经运行了几个月,它正在使用各种 PHP 版本的各种服务器上运行。

脚本读取 URL 并根据 URL 重新路由,例如点击 /offer/abc1234.html 它将调用类 offer 并将 abc1234 作为参数传递。

我创建了一个“故障转移”类,换句话说,如果您编写 /abc1234.html,它将测试各种数据库条目,如果它发现一个自动包含该类,就像它被 URL 调用一样,只需一点额外的开销,区别是:

  • /offer/abc1234.html :: index.php -> offer.php -> home.php
  • abc1234.html :: index.php -> error.php -> failover.php -> offer.php -> home.php

现在,鉴于这一切都有效并且已经工作了几个月,我的问题在于会话。

如果我点击 /offer/abc1234.html 我会看到会话集和发送到浏览器的 cookie

如果我点击 /abc1234.html 会话设置正确,没有错误(E_STRICT+E_ALL),没有警告,没有任何内容,但 cookie 不会发送到浏览器。我什至尝试在脚本末尾打印 $_SESSION,并且会话被填充并且所有变量都是正确的,除了标题。

我尝试对其进行调试并在各个地方添加各种 var_dump,但除了 header_list() 从未包含 session_cookie 但它确实包含我手动设置的其他 cookie 之外,其他任何地方都没有什么不同:

我目前打印:

  • 会话名称()
  • session_id() - 每次刷新时都会发生变化,但在整个页面上是一致的
  • session_get_cookie_params()
  • headers_list() - 这不包含 session_start 应该具有的 set-cookie 标头

输出类似于:

  • 字符串(6)“QSCSID”
  • 字符串(26)“456disv3pl4u2j81dej6h6d717”
  • array(5) { ["lifetime"]=> int(0) ["path"]=> string(1) "/" ["domain"]=> string(0) "" ["secure"]=> bool(false) ["httponly"]=> bool(false) }
  • array(4) { [0]=> string(38) "过期时间:星期四,1981 年 11 月 19 日 08:52:00 GMT" [1]=> string(77) "缓存控制:无存储,无缓存, must-revalidate, post-check=0, pre-check=0" [2]=> string(16) "Pragma: no-cache" [3]=> string(68) "Set-Cookie: spi=17468 ;过期=星期六,2013 年 10 月 26 日 05:02:23 GMT;路径=/" }

再一次,我疯了,因为当天早些时候一切正常,然后我重新启动了 apache,它停止了工作。

我检查了服务器,文件夹未满,可写,文件被创建,当我调用 abcd1234.html 时为空

编辑
在处理它时,我开始直接在服务器上通过“ee”(FreeBSD 编辑器)打开文件。直到我打开/保存了一个类,没有对文件进行任何更改,我不小心添加了一个空格并删除了它,然后当我退出时,编辑器要求我保存,我说是。

PHP 是用 eaccelerator 编译的,我已经删除了缓存文件夹以及重新启动 apache 并看到文件夹自动填充。这样的类(failover.php)是一个简单的 4 函数,其中每个函数都是一个查询,然后该构造同时调用每个函数。

所以,它似乎工作,但我想知道是否有人经历过这样的事情,如果他们知道问题可能是什么

4

1 回答 1

0

我无法复制它,一旦我打开文件并在 FreeBSD 上用“ee”关闭,一切正常。

于 2012-12-13T23:09:02.190 回答