Php 从会话存储文件中读取会话数据

Php 从会话存储文件中读取会话数据,php,serialization,Php,Serialization,PHP unserialize()函数名为抛出错误 unserialize() [function.unserialize]: Error at offset 0 of 1781 bytes 我还尝试了session\u decode(),它返回bool(false) magic\u quotes\u gpc是Off 嗯,我正在读文件的内容,它是序列化的。文件内容如下所示 核心| a:3:{s:23:"会话"验证器"数据"a:4:{s:11:"远程"地址"s:15:"117.241.113.2

PHP unserialize()函数名为抛出错误

unserialize() [function.unserialize]: Error at offset 0 of 1781 bytes
我还尝试了
session\u decode()
,它返回
bool(false)

magic\u quotes\u gpc
Off

嗯,我正在读文件的内容,它是序列化的。文件内容如下所示

核心| a:3:{s:23:"会话"验证器"数据"a:4:{s:11:"远程"地址"s:15:"117.241.113.248"s:8:"http"via"s:0:"s:20:"http"x"转发"u给"s:0:"s:15: (Windows;U;Windows NT 5.1;en-US; rv:1.9.2.13)壁虎/20101203 3.3.6.13“;7)s:13:“sesese7.3.3.3.3.13”s:13:“sesese7.3.3.3.3.3.3.13”s:13:“会话”3.3.3.3.6.13”s:13:“sea”s:13:“sesea:会议(U主机)主机”a:a:1:1:1::{s:1:1:1:::::::::::;3:3:3:3:“核心(模型)模型(模型)模型(模型)模型(模型)模型(模型(模型)消息)模型(模型(模型)消息收集收集)消息(消息)收集收集收集收集收集收集:2:2:2:2:2:2:2:2:2:2::::::;2::::;2:::;2::::::::::::::)2:::::::::为“s:0:”s:15:“http\u用户\u代理”转发了\u;s:90:“Mozilla/5.0 (Windows;U;Windows NT 5.1;en-US; rv:1.9.2.13)壁虎/20101203 Firefox/3.6.13;}s:13:“会话验证程序主机”a:1:{s:12:;b:1;}s:19:“愿望列表项目计数”i:0;}目录}a:3:{s:23:{U会话验证程序数据”a:4:{s:11:“远程地址”s:15:“117.241.113.248”s:8:“http通过”s:0:“s:20:“http\U转发给”s:0:“s:15:“用户”http:15:“http代理”Mozilla:90.0 (Windows;U;Windows NT 5.1;en-US; rv:1.9.2.13)壁虎/20101203 3.3.6.13“;)7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7为“s:0:”s:15:“http\u用户\u代理”转发了\u;s:90:“Mozilla/5.0 (Windows;U;Windows NT 5.1;en-US; rv:1.9.2.13)壁虎/20101203 Firefox/3.6.13“}s:13:“会话主机”;a:1:{s:12:”;b:1;}s:8:“消息”;O:34:“Mage_Core_Model_Message_Collection”:2:{s:12:^*^*^消息;a:0:{s:20:^*^*^^*^最新添加的消息;N;}

下面是我的PHP代码

$file='/var/www/html/products/var/session/sess_0ehb7ek0hmunqo3kq70t0t6mb0';
$contents=file_get_contents($file);
$data = unserialize($contents); 
var_dump($data);
在取消序列化数据之前,我已经尝试了
stripslashes()
。 不确定数据中的问题在哪里。
我无法更改将数据存储到文件中的机制,因为这是由Magento处理的,用于在文件级别管理会话。

这不是合法的PHP序列化数据,这是PHP会话数据

PHP会话数据在内部使用序列化格式,但它本身不是序列化数据

唯一能够安全、理智地读取会话数据的是PHP的会话代码。有时可以使用正则表达式和一些创造性的编辑来阅读它,但不能依赖于这些方法

如果您需要用户会话中的数据,最好的办法是编写一个自定义会话包装器,让它在数据本身发生变化时完成工作,而不是在事后尝试处理数据


(我不是说自定义会话编写代码,我是说一个类,您可以使用它来代替直接使用
$\u session

如果您想解码会话数据,请使用
session\u decode
(请参阅)<代码>取消序列化仅解码单个变量,不解码会话数据

您可以执行以下操作:

$file = '/var/www/html/products/var/session/sess_ciktos8icvk11grtpkj3u610o3';
$contents = file_get_contents($file);
session_start();
session_decode($contents);
print_r($_SESSION);

签出,这可能会点击你的东西

function read($filename)
{
    session_save_path("/tmp/tst");
    session_start();
    echo    $sCurrentFile = "/tmp/tst/sess_".session_id();
    $sFileToRead = $filename;
    if( !file_exists($sFileToRead) || !$sessionData=(string)@file_get_contents($sFileToRead) )
    {
        echo "file does not exist";
    }

    $fh = fopen($sCurrentFile, 'w') or die("can't open file");
    fwrite($fh, $sessionData);
    fclose($fh);
    $_SESSION["mytest"] = 444; 
    print_r($_SESSION);
}

以下是从会话文件读取会话数据的方法

//$file='/var/www/html/products/var/session/sess_ciktos8icvk11grtpkj3u610o3';
$sSessId = 'ciktos8icvk11grtpkj3u610o3';
session_id($sSessId);
session_start();
print_r($_SESSION);
使用此类:

    <?php
class Session {
    public static function unserialize($session_data) {
        $method = ini_get("session.serialize_handler");
        switch ($method) {
            case "php":
                return self::unserialize_php($session_data);
                break;
            case "php_binary":
                return self::unserialize_phpbinary($session_data);
                break;
            default:
                throw new Exception("Unsupported session.serialize_handler: " . $method . ". Supported: php, php_binary");
        }
    }

    private static function unserialize_php($session_data) {
        $return_data = array();
        $offset = 0;
        while ($offset < strlen($session_data)) {
            if (!strstr(substr($session_data, $offset), "|")) {
                throw new Exception("invalid data, remaining: " . substr($session_data, $offset));
            }
            $pos = strpos($session_data, "|", $offset);
            $num = $pos - $offset;
            $varname = substr($session_data, $offset, $num);
            $offset += $num + 1;
            $data = unserialize(substr($session_data, $offset));
            $return_data[$varname] = $data;
            $offset += strlen(serialize($data));
        }
        return $return_data;
    }

    private static function unserialize_phpbinary($session_data) {
        $return_data = array();
        $offset = 0;
        while ($offset < strlen($session_data)) {
            $num = ord($session_data[$offset]);
            $offset += 1;
            $varname = substr($session_data, $offset, $num);
            $offset += $num;
            $data = unserialize(substr($session_data, $offset));
            $return_data[$varname] = $data;
            $offset += strlen(serialize($data));
        }
        return $return_data;
    }
}
?>

用法:

<?php
Session::unserialize(file_get_contents($sessionSavePath."/".$sessionFileName);
?>
试试看

我不知道为什么,但内容包含3个独立的变量(类型core、customer和checkout)。也许这就是导致unserialize出现问题的原因?@kevin:是的,它包含了。有问题吗?我相信(不完全是肯定的)一次只能[反]序列化一个变量。您是否尝试过将它们拆分并取消它们的序列化?请在这里查看我的解决方案:我已经尝试了所有可能的方法来在我的站点上获取所有当前会话。现在,这是我的最后一个选项,从文件中读取当前活动会话数据并对其进行处理。尝试此选项返回bool(false)在解码前尝试执行会话_start(),然后检查$会话。@statsm:添加会话_start()后;它返回true,但字符串也转换为数字1。如果它返回true,则值应在$\u会话中。通话后$\u会话中有什么内容?虽然这是唯一受官方支持的方式,但它会覆盖您现有的会话。链接到此评论的来源(积分到期!):请说明如何设置
$sessionSavePath
$sessionFileName
注意,不鼓励使用。答案应该是搜索解决方案的终点,而不是指向一个经常随着时间推移而变得陈旧的链接。请考虑在这里添加一个独立的概要,将链接作为参考。