从不同文件访问相同SESSION变量的问题

时间:2011-10-31 19:49:34

标签: php jquery wordpress session

我正在使用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);
}

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

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

更新2

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

如果主脚本使用备用会话“保存处理程序”而不是Ajax脚本,则可能会更糟,导致两个单独的会话存储在两个不同的位置。