【问题标题】:PHP session not being saved between pages页面之间未保存 PHP 会话
【发布时间】:2011-07-05 14:14:50
【问题描述】:

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

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

我可以确认:

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

这是来自 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

我已联系托管公司,他们不会调查,因为他们说这是软件问题,而不是托管帐户。呜呜呜……

为了让您可以看到一些不起作用的代码,我从我链接到的文章中窃取了代码:

// 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 中没有输出(当然除了链接)。

非常感谢您的任何帮助。

【问题讨论】:

  • 任何标题问题,您是否使用 error_reporting(-1) 来获得最大的错误消息?
  • @Marek - 除了检查 php.ini 文件中的 session.save_path 是否正确设置之外,我会在该帖子中找到所有内容。但我现在也这样做了。
  • @krifur - 我现在已通过 error_reporting(E_ALL) 明确设置错误报告。不幸的是,我没有收到任何错误消息。
  • 对不起,错过了你的帖子。你能在 Apache/PHP 日志中看到一些东西吗?你用的是什么 PHP 版本?

标签: php session configuration


【解决方案1】:

在脚本结束前尝试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.';

【讨论】:

  • 干杯沃尔克。但我应该注意到我也尝试过。
  • @Joe “我也试过了” - 测试会话文件的文件大小并打印其内容的部分? ;-)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2011-04-19
    • 2019-04-04
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多