PHP页面之间没有保存会话

时间:2011-07-05 14:14:50

标签: php session configuration

我刚刚购买了一些新的服务器空间,我正在将一个非常简单的PHP应用程序迁移到其他服务器上。

由于某种原因,会话数据未存储在新服务器上的页面之间的$ _SESSION变量中。我看过this similar SO article和其他许多人试图解决这个问题。

我可以确认:

  1. 会话内容在我的其他网站上正常运行。我查看了session.save_path定义的目录,其中有很多会话文件(在OLD服务器上)。
  2. 我在页面末尾回显了$ _SESSION变量的内容,并且它保存了正确的数据,它只是没有被保存。
  3. 我为每个页面都回显了session_id()并获得相同的输出。
  4. 我查看了NEW服务器的session.save_path文件夹(/ usr / lib / php / session)指定的文件夹,并且没有任何文件。我检查了权限,它设置在drwxrwx ---,这应该意味着php程序可以写入它,对吗?
  5. 我没有.htaccess文件。
  6. 我正在运行CentOS 5.5
  7. 这是来自phpinfo()输出的相关部分:

    Session Support     enabled
    Registered save handlers    files user
    Registered serializer handlers  php php_binary wddx
    
    Directive   Local Value Master Value
    session.auto_start  Off Off
    session.bug_compat_42   Off Off
    session.bug_compat_warn On  On
    session.cache_expire    180 180
    session.cache_limiter   nocache nocache
    session.cookie_domain   no value    no value
    session.cookie_lifetime 0   0
    session.cookie_path /   /
    session.cookie_secure   Off Off
    session.entropy_file    no value    no value
    session.entropy_length  0   0
    session.gc_divisor  1000    1000
    session.gc_maxlifetime  1440    1440
    session.gc_probability  1   1
    session.hash_bits_per_character 5   5
    session.hash_function   0   0
    session.name    PHPSESSID   PHPSESSID
    session.referer_check   no value    no value
    session.save_handler    files   files
    session.save_path   /var/lib/php/session    /var/lib/php/session
    session.serialize_handler   php php
    session.use_cookies On  On
    session.use_only_cookies    Off Off
    session.use_trans_sid   0   0
    

    我已经联系了托管公司,他们不会调查它,因为他们说这是一个软件问题而且它不是托管帐户。 Grrrrr ...

    这样你就可以看到一些不起作用的代码,我从我链接到的文章中窃取了代码:

    // info.php
    <?
    session_start();
    
    $_SESSION['ID'] = "112233";
    $_SESSION['token'] = "mytoken";
    
    print $_SESSION['ID'];
    print $_SESSION['token'];
    ?>
    <a href="info2.php">info 2</a>
    

    和一个名为info2的代码:

    // info2.php
    <?
    session_start();
    
    print $_SESSION['ID'];
    print $_SESSION['token'];
    ?>
    <a href="info.php">info</a>
    

    结果是在info.php中打印数组数据,但在info2.php中没有输出(当然除了链接)。

    非常感谢您的任何帮助。

2 个答案:

答案 0 :(得分:7)

在脚本结束前尝试explicitly closing the session;也许你看到一些错误信息。

<?php
error_reporting(E_ALL); ini_set('display_errors', true);
session_start();
echo '<a href="?', time(), '">refresh</a>', "\n";

echo '<pre>';
echo 'session id: ', session_id(), "\n";

$sessionfile = ini_get('session.save_path') . '/' . 'sess_'.session_id();
echo 'session file: ', $sessionfile, ' ';
if ( file_exists($sessionfile) ) {
    echo 'size: ', filesize($sessionfile), "\n";
    echo '# ', file_get_contents($sessionfile), ' #';
}
else {
    echo ' does not exist';
}

var_dump($_SESSION);
echo "</pre>\n";

$_SESSION['ID'] = "112233";
$_SESSION['token'] = "mytoken";

session_write_close();
echo 'done.';

答案 1 :(得分:1)

如果会话文件的大小为零,请确保服务器上仍有可用的磁盘空间。这就是我遇到的问题。

在Linux服务器上使用df -h检查磁盘空间。