会话重新生成id和Session_save_path();


Session regenerate id and session_save_path( );

你好,我有下面的脚本:

 <?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']
?>

现在我注意到,一旦生成了新的会话id,我就会丢失在"session_save_path('sessions/')"中指定的路径。这意味着我无法创建新会话。

我实际上得到了以下错误。

Warning: Unknown: open(sessions//sess_7af5c5f2f2bd83afff0203cc45190260, O_RDWR) failed:    No such file or directory (2) in Unknown on line 0
Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (sessions/) in Unknown on line 0

求你了,我需要紧急帮助。

如前所述,使用参数到session_save_path( )的绝对路径。原因如下。

当使用相对路径作为参数时,session_save_path( )session_regenerate_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
  • 刷新页面使得整数随着每次连续刷新而增长一
  • 会话文件位于目录c:''www''test''sessions中(此目录必须事先创建-PHP不会为您创建!)
  • 并且该会话文件随着每次连续刷新而更新

当我取消注释session_regenerate_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 is NOT exists"错误消息——至少,这不是我所期望的。我在Apache2.2目录中发现了另一个同名文件。在php.ini中,我为error_log指令指定了一个简单的文件名,没有目录路径。在regen命令之前生成的任何错误消息都会转到c:''www''test''php_errors.log,但在regen之后会转到Apache目录中的文件。因此,regen造成的混乱似乎超出了会话功能。