2011-07-05 58 views
2

我刚刚买了一些新的服务器空间,并且正在将一个非常简单的PHP应用程序迁移到它,在我的其他服务器上正常工作。PHP会话没有被保存在页面之间

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

我可以确认:

  1. 会话的东西是我的其他网站工作的罚款。我查看了session.save_path定义的目录,并且在那里有很多会话文件(在OLD服务器上)。
  2. 我在页面末尾回显了$ _SESSION变量的内容,它保存着正确的数据,它只是没有被保存。
  3. 我为每个页面echo'd session_id()并获得相同的输出。
  4. 我看了一下NEW服务器的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 

我已经联系了托管公司,他们不会考虑,因为他们说这是一个软件问题,它不是一个管理帐户。 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中没有输出(除了链接当然)。

非常感谢您的任何帮助。

+0

尝试从这里回答:http://bytes.com/topic/php/answers/783445-session-not-holding-value –

+0

任何标题的麻烦,你使用error_reporting(-1)获得最大的错误信息? – krifur

+0

@Marek - 除了检查session.ave_path在php.ini文件中设置的正确性之外,我还是会在该文章中的所有内容。但我现在也这样做了,事实就是如此。 – Joe

回答

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.'; 
+0

干杯Volker。但我应该注意到,我也尝试过。 – Joe

+0

@Joe“我也试过了” - 测试会话文件的文件大小并打印其内容的部分? ;-) – VolkerK

+0

啊。你是对的。我没有那样做。我会放弃这一点。 – Joe

1

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

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