将会话文件从服务器一(debian lenny php 5.2)迁移到新服务器(debian squeeze php 5.3)后,php 将会话文件截断为零。
我使用 createsession.php 在服务器一上创建一个会话(见下文),并且可以使用同一服务器上的 dumpsession.php 查看会话的内容。
将会话文件从服务器一复制到另一台服务器,并通过更改本地主机文件切换到服务器二之后,我仍然拥有存储在浏览器中具有正确会话ID的相同cookie,新服务器访问正确的会话文件,但服务器不会显示会话的内容,而是将会话文件截断为零并使用相同的会话ID启动新会话。
是否可以迁移会话文件?serverip 是否以某种方式散列到会话数据中?
php5.2 和 php5.3 之间可以共享会话吗?
创建会话.php
<?php
session_name('mysession');
session_start();
var_dump(session_id());
var_dump($_SESSION);
?>
转储会话.php
<?php
session_name('mysession');
session_start();
var_dump(session_id());
$_SESSION['foo'] = 'bar';
?>
php.ini 会话部分
[Session]
session.save_handler = files
session.save_path = "3;/var/lib/php5"
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_divisor = 100
session.gc_maxlifetime = 5184000
session.bug_compat_42 = 1
session.bug_compat_warn = 1
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 4
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=,fieldset="
编辑:我的解决方案是切换回 debian lenny。
答案1
如果它发生了变化,我会感到非常惊讶(没有权限亲自检查)。
如果将会话文件复制到 /tmp,会发生什么情况:
$s=('/tmp/sess_' . session_id);
print_r(unserialize(substr($s, strpos($s, '|')+1)));
我认为会话文件格式发生改变的可能性比 serialize() 格式的改变更大 - 因此只需使用您自己的会话处理程序就可以解决问题。
无论如何 - 如果您在多台机器上运行网站,您应该尝试在每台机器上保留相同的配置软件 - 这会让生活变得简单很多。
答案2
您可以通过删除php5-suhosin包裹。
aptitude remove --purge php5-suhosin
显然它的新功能之一是加密会话数据,此功能在您从 lenny 升级到 squeeze 时启用。
我花了很长时间来解决这个问题!