为啥我的 PHP 会话会死掉?为啥我不能恢复它们?

Posted

技术标签:

【中文标题】为啥我的 PHP 会话会死掉?为啥我不能恢复它们?【英文标题】:Why are my PHP sessions dying? And why can't I restore them?为什么我的 PHP 会话会死掉?为什么我不能恢复它们? 【发布时间】:2010-09-16 02:01:01 【问题描述】:

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

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

奇怪的是,当 PayPal 重定向回来时,PHP 会话消失了。这是well-documented issue。

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

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

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

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 将其设置回 82460dcf8c8ddd538466e7cb89712e72session_id 现在是 360ba3fd99d233e0735397278d2b2e55

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

【问题讨论】:

【参考方案1】:

只是一个想法......

您是否将session.referer_check 设置为您的主机? 默认值为空字符串,但它可能已被更改......当页面从 PayPal '返回'时,php 将丢弃会话信息。

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

【讨论】:

叮叮叮!这就是为什么我的 PHP 会话正在死去。 大声笑,很高兴你把它理顺了。【参考方案2】:

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

【讨论】:

我知道,但是如果您的服务器配置为 auto_start=True,则会话会在每个页面上自动启动。因此,您对 session_id($session_id) 的调用将不起作用,因为此调用必须在 session_start 调用之前。如果 auto_start=true,那么它已经被盯上了。

以上是关于为啥我的 PHP 会话会死掉?为啥我不能恢复它们?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Django fcgi 会死?我怎样才能知道?

PHP - 为啥我不能摆脱这个会话 id cookie?

PHP 会话,为啥 session_start() 需要多次?

为啥我不能初始化 Alamofire 4 会话管理器?

为啥在取消 git 提交后我的更改消失了,我该如何恢复它们?

为啥AngularJS的$http指定了Request Method无效