【问题标题】:Problems accessing same SESSION variables from different files从不同文件访问相同 SESSION 变量的问题
【发布时间】:2011-12-19 00:34:50
【问题描述】:

我正在使用 Wordpress 开发一个网站。

我的永久链接结构设置为显示帖子/页面名称。因此访问名为 store 的页面将如下所示:www.mysite.com/store/?some=arguments

在我所有的 WP 模板中,我可以使用 print_r($_SESSION); 输出我的所有 SESSION 变量

对从jQuery.ajax 调用的文件执行相同操作只会输出一些 SESSION 变量。

我使用下面的代码来查看两个文件的 cookie 路径是否相同,它们是:

$sessCookie = ini_get('session.cookie_path'); 
echo 'session.cookie_path: '.$sessCookie; 

我的文件中也有此代码以确保会话已启动:

if (!session_id())
  session_start();

为什么我无法从 WP 模板和从 jQuery.ajax 调用的 php 文件输出相同的会话变量?

更新

jQuery.ajax 调用jquery.php 文件。在这个文件的顶部,它有以下代码:

require_once($_SERVER['DOCUMENT_ROOT'].'/wp-blog-header.php');

此代码触发functions.php。在这个文件中,我有以下代码:

function session_manager() {
  if (!session_id())
        session_start();

  // Get variables in query string
  $_SESSION['action'] = (isset($_GET['action']) ? $_GET['action'] : '');
  $user_geo_data = get_geoip_record();     
  $_SESSION['user_geo_location'] = get_object_vars($user_geo_data);
}

当jquery.php 触发functions.php 时,session_id() 似乎返回 false,因此我创建了一个新会话。

有没有办法继续使用同一个会话?

更新 2

似乎 WP 配置在初始化时会杀死所有 GLOBAL 变量。

http://wordpress.org/support/topic/wp-blog-headerphp-killing-sessions

【问题讨论】:

    标签: php jquery wordpress session


    【解决方案1】:

    Wordpress 可以使用自己的会话处理程序,并覆盖默认的会话处理程序来这样做。所以本质上你有两个不同的会话,即使它们共享相同的 ID。 cookie 路径只是客户端 cookie 的操作方式。您需要检查的是session_save_path(),并检查 WP 是否通过数据库而不是默认文件处理程序运行会话。

    【讨论】:

    • 两者的保存路径相同 (I:/Development/wamp/tmp)。我也测试了session_id(),它们不一样。
    • 好的,如果会话 ID 不同,则有两个单独的会话在运行。在两者中检查session_name() - 您可能会发现您有 2 个会话 cookie 来回浮动。在您可以在两个系统之间共享会话之前,名称和 ID 必须相同。
    • 我已经测试过了,它们都使用默认值:PHPSESSID。
    • 那很奇怪。当其他一切都相同时,我无法看到单个浏览器如何为同一个 cookie 发送两个不同的值。如果这两个 cookie 有不同的 cookie 路径(但你说两者都是 /),或者一个是仅安全的而另一个不是。
    • 我删除了 /tmp/ 文件夹中的所有会话 cookie 并监视了该目录的内容。浏览普通页面时会创建一个会话,而当我调用uploadify.php 时会创建一个新会话。这两个文件的内容不一样(用记事本打开)。
    【解决方案2】:

    启动两个会话的原因是,第一个会话是基于浏览器的(通过 cookie),而第二个会话使用 Ajax,本质上是服务器端的,并且无法访问会话 cookie。

    会话 cookie 是会话 ID 的存储位置,用于识别现有会话。服务器端 Ajax 脚本无权访问浏览器的 cookie,因此会启动一个新会话。

    如果主脚本使用备用会话“save handler”比Ajax 脚本更糟,导致两个单独的会话,存储在两个不同的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      • 2012-06-29
      • 2021-04-03
      相关资源
      最近更新 更多