如前所述,为参数使用绝对路径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 - 或者,它尝试这样做,但如果该目录有尚未创建。创建第二个会话目录后,我看到会话文件出现在那里。但是当我调用 session_start() 时 PHP 并没有看到那里,所以所有积累的会话知识在脚本调用之间都丢失了。
我只是想通了这一点,因为我没有在“php_errors.log”中收到“目录不存在”错误消息——至少不是我所期望的。我在 Apache2.2 目录中发现了另一个同名的文件。在 php.ini 中,我为我的 error_log 指令指定了一个简单的文件名,没有目录路径。在 regen 命令之前生成的任何错误消息都会转到 c:\www\test\php_errors.log,但在 regen 之后会转到 Apache 目录中的文件。因此,重新生成的混淆似乎超出了会话功能。