Php 会话重新生成id和会话保存路径();

Php 会话重新生成id和会话保存路径();,php,Php,您好,我有以下脚本: <?php session_save_path('sessions/'); if (!isset($_SESSION)) { session_start(); } $loginUsername = A; if (PHP_VERSION >= 5.1) {session_regenerate_id(true); } else {session_regenerate_id();} $_SESSION['wallet_em

您好,我有以下脚本:

 <?php
   session_save_path('sessions/');
    if (!isset($_SESSION)) {
    session_start();
    }
   $loginUsername = A;

   if (PHP_VERSION >= 5.1) {session_regenerate_id(true); } else {session_regenerate_id();}
$_SESSION['wallet_email'] = $loginUsername;
   echo  $_SESSION['wallet_email']

?>

我需要紧急帮助。

如前所述,为参数使用绝对路径,以
会话保存路径()
。原因如下

session\u save\u path()
session\u regenerate\u id()
在使用相对路径作为前者的参数时,不能很好地配合使用。在我的设置(Windows 7、Apache 2.2.25、php 5.3.27)中,我在c:\www\test中有以下index.php:

<?php
date_default_timezone_set( 'America/New_York' );
ini_set( 'session.save_path', './sessions' );
//ini_set( 'session.save_path', 'c:/www/test/sessions' );

session_start( );
if ( !isset( $_SESSION[ 'count' ] )) {
    $_SESSION[ 'count' ] = 0;
}
$s1 = session_id( );
$b1 = $_SESSION[ 'count' ]++;
//session_regenerate_id( true );
$s2 = session_id( );
$b2 = $_SESSION[ 'count' ]++;
?>
<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <h1>Test</h1>
        <p><?php echo "$s1: $b1"; ?></p>
        <p><?php echo "$s2: $b2"; ?></p>
    </body>
</html>

试验
试验

它就像你想的那样工作。当我浏览到脚本时:

  • 同一会话ID打印两次
  • 每个会话ID后面都有一个整数
  • 第二个整数比第一个整数大1
  • 刷新页面会使整数在每次连续刷新时增长1
  • 会话文件位于目录c:\www\test\sessions中(此目录必须事先创建-PHP不会为您创建!)
  • 并且该会话文件会随着每次连续刷新而更新
当我取消注释session_regenate_id()命令并浏览到我的脚本时:

  • 我得到两个不同的会话ID
  • 刷新时,第一个会话ID与上一页的第二个会话ID相同
  • 整数始终分别为0和1
  • c:\www\test\sessions中没有会话文件。(如果我将'false'传递给regen(),则会累积一系列空会话文件。)
当我改为使用第二个ini_set命令(使用完整路径)时,它可以正常工作

问题似乎是regen函数混淆了PHP:在regen之后,PHP将会话文件写入c:\Program files\Apache Software Foundation\Apache2.2\sessions,或者,它尝试写入,但如果尚未创建该目录,则会失败。创建第二个sessions目录后,我看到sessions文件显示在那里。但是当我调用session_start()时,PHP没有注意到这一点,因此在脚本调用之间,所有累积的会话知识都会丢失


我之所以发现这一点,是因为我在“php_errors.log”中没有收到“directory NOT exist”(目录不存在)错误消息——至少,这不是我所期望的。我在Apache2.2目录中发现了另一个同名文件。在php.ini中,我为error_log指令指定了一个简单的文件名,没有目录路径。在regen命令之前生成的任何错误消息都会转到c:\www\test\php\u errors.log,但在regen之后,会转到Apache目录中的文件。因此,regen造成的混乱似乎超出了会话功能。

仔细检查目录上的权限,确保php具有写入权限。另外,您可能希望指定一个完整的绝对路径,例如
/some/dir/sessions
,否则,您可能会在试图访问子目录下的php脚本时遇到问题,因为脚本可能会在加载脚本的子目录下查找
会话/
。您好,Jonathan,谢谢您的评论。我会给你一个尝试的解决方案。但是,我也注意到,当我试图从包含文件创建会话变量时,并没有创建会话。例如如果在名为“test.php”的文件中有以下命令,$\u SESSION['test']='ok',那么我在另一个文件require_once('test.php')中执行此操作;如果运行第二个文件,则不会创建会话变量。有什么帮助吗?请尝试将会话路径设置为绝对路径。包含的文件可能正在子文件夹下查找会话路径。例如,文档根是
/var/www/
,会话路径是
session/
。对于
/var/www/
下的文件,它将在
/var/www/session/
中查找会话路径。如果加载了
/var/www/test/
下的文件,它将在
/var/www/test/session/
中查找会话路径。您希望确保无论脚本加载到哪里,会话路径都是相同的,唯一的方法是使用完整的绝对路径,如
/var/www/session/
。正如Jonathan所说,使用绝对路径。错误(“没有这样的目录”)非常清楚
<?php
date_default_timezone_set( 'America/New_York' );
ini_set( 'session.save_path', './sessions' );
//ini_set( 'session.save_path', 'c:/www/test/sessions' );

session_start( );
if ( !isset( $_SESSION[ 'count' ] )) {
    $_SESSION[ 'count' ] = 0;
}
$s1 = session_id( );
$b1 = $_SESSION[ 'count' ]++;
//session_regenerate_id( true );
$s2 = session_id( );
$b2 = $_SESSION[ 'count' ]++;
?>
<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <h1>Test</h1>
        <p><?php echo "$s1: $b1"; ?></p>
        <p><?php echo "$s2: $b2"; ?></p>
    </body>
</html>