几天的研究和调试..PHP 会话变量仍未保存


Days of research and debugging... PHP session var still not being saved

场景

  1. 用户登录(登录.php)并单击"计算到期金额"按钮。
  2. 对calculate_checkout_total.php进行 AJAX 调用,这将返回一个 JSON 对象,其中包含来自客户的应付总额(十进制)。此金额存储在 $_SESSION['vendor_checkout_total'] 中。
  3. 向用户显示到期金额,然后单击"付款"按钮。AJAX 调用是针对pay_checkout_total.php
  4. pay_checkout_total.php检查 $_SESSION['vendor_checkout_total'] 以获得应付总金额。

问题

$_SESSION['vendor_checkout_total'] 似乎从未真正保存过。 pay_checkout_total.php找不到此会话 var(未定义的索引)。

是的,在访问/保存会话变量之前调用 session_start()。

所有其他会话变量(在其他 PHP 文件中)似乎都已正确存储和访问。

到目前为止我尝试过什么

  • 在登录结束时调用 exit(.php
  • 在 calculate_checkout_total.php JSON 对象中返回 $_SESSION 并验证是否正在存储会话 var。但是,当我检查/var/lib/php5/sessions 时,没有一个会话文件包含 $_SESSION['vendor_checkout_total']。我看到了其他会话变量,但没有看到这个。好像会话变量只存在于这个页面中?
  • 尝试在calculate_checkout_total.php中设置不同的会话变量 - 仍未保存。
  • 已验证两个PHP文件上的session_id()是否相同。
  • 已验证包含 PHPSESSID 的 cookie 是否正在传递到请求标头。
  • 将/var/lib/php5/sessions 的所有权从根更改为具有读写执行权限的 www-data。已验证此文件夹中的所有文件是否都属于www-data。
  • 我有以下 PHP.ini设置

session.save_path = "/var/lib/php5/sessions"

session.gc_probability=0

session.cookie_path = "/"

session.use_cookies = 1

任何帮助或想法将不胜感激。我不知道还能寻找什么。

更新我在脚本中包含的文件中包含 session_write_close() 中找到了一个。删除它后,会话变量的行为符合预期。

(这是一个评论,不是答案,但有点长)。

听起来您正在尝试一次性调试整个应用程序。您应该做的第一件事是构建一个非常简单的测试台来评估会话问题:

<?php
error_reporting(E_ALL);
session_start();
print "Iteration: " . ++$_SESSION['counter'];

并找出您的会话未按预期运行的原因。

您说 cookie 正在正确填充和返回。这意味着您未向我们显示的代码中存在错误,或者由于配置/权限问题而未写入会话数据。

检查您的session.save_path(假设您使用的是默认处理程序)