Чтение данных сеанса из файла хранения сеанса

Облицовочная проблема с функцией PHP unserialize() под названием "Ошибка".

unserialize() [function.unserialize]: Error at offset 0 of 1781 bytes

Я также попробовал session_decode(), которые возвращают bool(false)

magic_quotes_gpc Off.

Ну, я читаю содержимое файла, который сериализуется. Содержимое файла выглядит следующим образом.

Ядро | а: 3: {s: 23: "_ session_validator_data"; а: 4: {s: 11: "remote_addr"; s: 15: "117.241.113.248"; s: 8: "HTTP_VIA"; s: 0: "; s: 20:" HTTP_X_FORWARDED_FOR "; s: 0:" "; s: 15:" HTTP_USER_AGENT "; s: 90:" Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv: 1.9.2.13) Gecko/20101203 Firefox/3.6.13 ";} s: 13:" session_hosts "; а: 1: {s: 12:" "; б: 1;} s: 8:" Сообщения "; O: 34:" Mage_Core_Model_Message_Collection ": 2: {s: 12:" ^ @* ^ @_ сообщения "; а: 0: {} s: 20:" ^ @* ^ @_ lastAddedMessage "; N;}} клиент | а: 3: {s: 23:" _session_validator_data "; а: 4: {s: 11:" remote_addr "; s: 15:" 117.241.113.248 "; s: 8:" HTTP_VIA "; s: 0:" "; s: 20:" HTTP_X_FORWARDED_FOR "; s: 0:" "; s: 15:" HTTP_USER_AGENT "; s: 90:" Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv: 1.9.2.13) Gecko/20101203 Firefox/3.6.13 ";} s: 13:" session_hosts "; а: 1: {s: 12:" "; б: 1;} s: 19:" wishlist_item_count "; я: 0;} Каталог | а: 3: {s: 23: "_ session_validator_data"; а: 4: {s: 11: "remote_addr"; s: 15: "117.241.113.248"; s: 8: "HTTP_VIA"; s: 0: "; s: 20:" HTTP_X_FORWARDED_FOR "; s: 0:" "; s: 15:" HTTP_USER_AGENT "; s: 90:" Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv: 1.9.2.13) Gecko/20101203 Firefox/3.6.13 ";} s: 13:" session_hosts "; а: 1: {s: 12:" "; б: 1;} s: 8:" Сообщения "; O: 34:" Mage_Core_Model_Message_Collection ": 2: {s: 12:" ^ @* ^ @_ сообщения "; а: 0: {} s: 20:" ^ @* ^ @_ lastAddedMessage "; N;}} контроль | а: 3: {s: 23:" _session_validator_data "; а: 4: {s: 11:" remote_addr "; s: 15:" 117.241.113.248 "; s: 8:" HTTP_VIA "; s: 0:" "; s: 20:" HTTP_X_FORWARDED_FOR "; s: 0:" "; s: 15:" HTTP_USER_AGENT "; s: 90:" Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv: 1.9.2.13) Gecko/20101203 Firefox/3.6.13 ";} s: 13:" session_hosts "; а: 1: {s: 12:" "; б: 1;} s: 8:" Сообщения "; O: 34:" Mage_Core_Model_Message_Collection ": 2: {s: 12:" ^ @* @^ _ сообщения "; а: 0: {} s: 20:" ^ @* ^ _ @lastAddedMessage", N;}}

мой PHP-код ниже

$file='/var/www/html/products/var/session/sess_0ehb7ek0hmunqo3kq70t0t6mb0';
$contents=file_get_contents($file);
$data = unserialize($contents); 
var_dump($data);

Я уже пробовал stripslashes() перед нессериализующими данными. Не знаете, где проблема в данных. Я не могу изменить механизм хранения данных в файле, потому что Magento обрабатывает сеанс на уровне Файла.

Ответы

Ответ 1

Если вы хотите декодировать данные сеанса, используйте session_decode (см. manual). unserialize только декодирует отдельные переменные, а не данные сеанса.

Вы можете сделать что-то вроде:

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

Ответ 2

Это не законные сериализованные данные PHP, данные этого сеанса PHP.

Данные сеанса PHP используют сериализованный формат внутри, но это не сериализованные данные.

Единственное, что может безопасно и безопасно читать данные сеанса, - это код сеанса PHP. Иногда его можно читать с помощью регулярного выражения и редактирования некоторых объявлений, но вы не можете полагаться на эти методы.

Если вам нужны данные из пользовательского сеанса, лучше всего написать специальную сессионную оболочку и позволить ей выполнять работу, когда сами данные меняются, а не пытаться работать с данными после факт.

(Я не говорю о пользовательском коде для написания сессии, я говорю о классе, который вы использовали бы вместо прямого использования $_SESSION.)

Ответ 3

Используйте этот класс:

    <?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);
?>

Thats Work!

Ответ 4

Ниже приведен способ чтения данных сеанса из файла сеанса

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

Ответ 5

проверить, это может вам что-то нажать

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);
}