Zend会话数据库处理程序和序列化数据

时间:2011-02-11 20:05:05

标签: php zend-framework session serialization

我们正在一个项目上使用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版本和/或配置的差异正在影响它,但我对如何做不知所措。

1 个答案:

答案 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