我们正在一个项目上使用Zend Framework 1.7(旧的,我知道),只是做了一个更改,将会话数据从文件移动到数据库。这似乎在我们部署它的两个环境中都能正常工作。
但是,有一个很大的区别:在环境A(PHP 5.2)中,会话数据以明文序列化格式存储,例如:
key|[php serialized array]
在环境B(PHP 5.3)中,数据似乎以某种方式获得base64编码:
IpgJ4fbSZ0v2qi4RmGcgQ9tP7YEUyN1R9-7oroGl4071fnlk_UVkkrkUcpdHdw_UsRYy-6NpL61gTuL2Htcmv3HU5UM3ClwSDndY40kyimDPs3SdS7gNHwhwdpailLOfrIxqV48hZDhNHKlIpSX2QZm0jOHjRhZc2kjXnMgqioLqJiDdgyUCRnqKcZ_ZtBISq8BAZARW61P5Ls_ZSO506ltuNqIJIJGkV2R7qvDKLLCtxUQUwd7P8IlJiC7iq_Q4GIn3gMr0KwAHLP6adzxSusVk5begrx9lBk9Dxp8KkJ8Gx8rfKJfvVBIJKZgmsFsWq41dV0J4y1Lgihvx9nU73g..
这两个环境似乎都在起作用,但我需要确保我们理解为什么会这样,我似乎无法在任何地方找到任何文档或类似情况。我的假设是php.ini中的PHP版本和/或配置的差异正在影响它,但我对如何做不知所措。
答案 0 :(得分:3)
我今天在群集服务器上遇到了同样的问题,其中一个是PHP 5.2,另一个是php 5.3。
我最初的猜测也是一个版本问题,但我发现到目前为止,suhosin是加密会话的问题。
您可以在加密的机器中解密会话;你应该在你的php.ini中更改以下内容:
suhosin.session.encrypt = on
suhosin.cookie.encrypt = on
session.save_handler = files
session.save_path = /tmp
然后写一个像:
这样的脚本$data = $argv[1];
$sessid = 'recovering';
file_put_contents("/tmp/sess_{$sessid}", $data);
session_id($sessid);
session_start();
print_r($_SESSION);
只会将加密的字符串复制到sess文件并打印内容(您可以序列化以匹配正常的会话行为)
当然如果你以后想要php不通过suhosin加密,你需要设置.encrypt = off