如何从Redis反序列化PHP会话?

时间:2018-08-30 16:20:19

标签: php redis

如何反序列化Redis中存储的PHP会话?我需要从websocket服务器获取会话变量。无法使用session_start()

unserialize($this->redis->get('PHPREDIS_SESSION:'.$session_id));

错误

  

unserialize():偏移量0为319字节错误

Redis

apt-get install php7.0-redis

127.0.0.1:6379> get PHPREDIS_SESSION:tmcls6v5n157q4kva4795hv4j1
"time_user_offset|i:0;activity_time|i:1535643086;ltype|s:6:\"CLIENT\";cid|i:1;uid|i:1;uid_admin|i:1;is_suspended|i:0;is_timeout_time|i:0;is_trial|i:0;is_full|i:1;lid|i:197240;is_ready|i:1;currency_name|s:3:\"DKK\";set_reverse_sign|i:0;bid|i:1;block_name|s:14:\"text\";addon_crm|i:1;suid|i:0;is_supporter|i:0;tmp|i:0;"

php.ini

session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"

更新

会话在PHP中可以正常工作,因此不是错误

1 个答案:

答案 0 :(得分:2)

PHP不使用其标准序列化格式来存储会话。相似,但是unserialize不知道如何阅读。如果使用php.ini中的session.save_handler设置将Redis配置为会话存储,则它将使用默认的serialize_handler值,并使用该序列化格式存储会话。

幸运的是,您仍然可以在PHP中手动对其进行解码-您只需要使用session_decode即可。这将使用您传递的数据(在本例中为Redis的字符串)填充$_SESSION超全局变量,然后您可以像在其他任何脚本中一样引用它。

请注意,如果您将其写回到服务器B上的会话,则不会将其保存回Redis(这很明显,但以防万一)。

服务器A:

<?php
session_start();
$_SESSION['foo'] = 'bar';

服务器B:

<?php
session_start();

$data = $this->redis->get('...');
session_decode($data);

echo $_SESSION['foo']; // bar

最后,为了清楚起见-这不是Redis或Redis会话处理程序的问题-如果您正在从文件系统读取会话并尝试使用unserialize对其进行解码,则您将遇到相同的问题。问题只在于序列化格式,而不是存储。