为什么我的 PHP 会话会死?为什么我不能恢复它们


Why are my PHP sessions dying? And why can't I restore them?

我有一个使用PHP和PayPal API的应用程序。获取付款的基本方法是,您对PayPal进行 Web 服务调用以获取令牌,然后执行浏览器重定向到使用该令牌PayPal供用户付款。确认付款详细信息后,PayPal重定向回您最初在服务调用中设置的 URL。

这一切都有效,每天都有数百万人使用它,等等。

奇怪的是,当PayPal重定向回来时,PHP会话消失了。这是一个有据可查的问题。

第一个问题:为什么会这样?两个页面位于同一域中,都使用 HTTPS。会话适用于所有请求,直到PayPal重定向回来。

链接的论坛话题建议了一种解决方法,即在PayPal请求中保留会话 ID,然后稍后检索它并恢复会话。太好了,除了它似乎不起作用。

我可以添加一些日志语句:

log(session_id());

在各种重定向之前和之后。从PayPal回来时,我会记录更多。

log("session id is " . session_id());
$session_id = get_session_id_from_paypal();
log("setting it back to " . $session_id);
session_id($session_id);
session_start();
log("session id is now " . session_id());

结果根本不是我所期望的:

session_id是fc8f459a186a3f4695ff9ac71b563825
将其设置回 82460DCF8C8DDD538466E7CB89712E72
session_id现在是 360ba3fd99d233e0735397278d2b2e55

第二个问题:为什么会话 ID 根本不是我设置的?我做错了什么?或者,至少,为什么没有一个会话变量返回?

只是一个想法...

您是否为主机设置了session.referer_check?默认值为空字符串,但可能已更改...当页面从PayPal"返回"时,PHP 将删除会话信息。

您可以使用 phpinfo() 检查session.referer_check

你能做一个phpinfo()并判断session.auto_start是否为真吗?