Чтение данных сеанса из файла хранения сеанса
Облицовочная проблема с функцией 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);
}
Ответ 6
попробовать
Чтение данных сеанса из файла сеанса