2011-01-15 36 views
15

Đối mặt với sự cố với chức năng PHP unserialize() có tiêu đề là lỗi đang ném.Đọc dữ liệu phiên từ tệp bộ nhớ phiên

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

Tôi cũng đã thử session_decode() mà trở bool(false)

magic_quotes_gpcOff.

Vâng, tôi đang đọc nội dung của tệp được đăng theo thứ tự. Nội dung tệp trông giống như bên dưới.

core | a: 3: {s: 23: "_ session_validator_data"; a: 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 "; a: 1: {s: 12:" "; b: 1;} s: 8: "tin nhắn"; O: 34: "Mage_Core_Model_Message_Collection": 2: {s: 12: "^ @ *^@ _ tin nhắn"; a: 0: {} s: 20: "^ @ *^@ _ lastAddedMessage"; N ;}} khách hàng | a: 3: {s: 23: "_ session_validator_data"; a: 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 "; a: 1: {s: 12:" "; b: 1;} s: 19:" wishlist_item_count "; i: 0 ;} danh mục | a: 3: {s: 23: "_ session_validator_data"; a: 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 "; a: 1: {s: 12:" "; b: 1;} s: 8:" thư "; O: 34:" Mage_Core_Model_Message_Collection ": 2: {s: 12:"^@ *^@ _ thư "; a: 0: {} s: 20:"^@ *^@ _ lastAddedMessage "; N;}} thanh toán | a: 3: {s: 23: "_ session_validator_data"; a: 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 "; a: 1: {s: 12:" "; b: 1;} s: 8:" thư "; O : 34: "Mage_Core_Model_Message_Collection": 2: {s: 12: "^ @ *^@ _ thư"; a: 0: {} s: 20: "^ @ *^@ _ lastAddedMessage"; N;}}

mã PHP của tôi là belo w

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

Tôi đã thử stripslashes() trước khi unserializing dữ liệu. Không chắc chắn đâu là vấn đề trong dữ liệu. Tôi không thể thay đổi cơ chế lưu trữ dữ liệu vào tệp vì điều này được xử lý bởi Magento cho phiên quản lý ở cấp Tệp.

+0

Tôi không chắc chắn lý do tại sao, nhưng nội dung chứa 3 biến riêng biệt (loại lõi, khách hàng và thanh toán). Có lẽ đó là nguyên nhân gây ra vấn đề trong unserialize? –

+0

@kevin: Có, nó chứa. Có vấn đề gì không? –

+0

Tôi tin rằng (không chính xác tích cực) mà bạn chỉ có thể [de] serialize một biến cùng một lúc. Bạn đã cố gắng tách chúng ra và unserializing những người? –

Trả lời

31

Nếu bạn muốn giải mã dữ liệu session, sử dụng session_decode (xem manual). unserialize chỉ giải mã các biến duy nhất, không phải dữ liệu phiên.

Bạn có thể làm một cái gì đó như:

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

Đã thử trả về bool (false) –

+0

thử làm session_start() trước khi giải mã, sau đó kiểm tra $ _SESSION. – StasM

+0

@StasM: Sau khi thêm session_start(); nó trả về true nhưng chuỗi cũng được chuyển đổi thành số 1. –

6

Đó không phải là dữ liệu tuần tự PHP hợp pháp, đó là dữ liệu phiên PHP.

Dữ liệu phiên PHP sử dụng định dạng được tuần tự hóa nội bộ, nhưng chính nó là không phải là dữ liệu được tuần tự hóa.

Điều duy nhất có thể đọc dữ liệu phiên một cách an toàn và an toàn là mã phiên của PHP. Đó là đôi khi có thể đọc nó bằng cách sử dụng cụm từ thông dụng và một số chỉnh sửa quảng cáo, nhưng bạn không thể dựa vào các phương pháp đó.

Nếu bạn cần dữ liệu trong phiên của người dùng, đặt cược tốt nhất của bạn là viết trình bao phiên tùy chỉnh và để nó hoạt động khi dữ liệu tự thay đổi thay vì thử và làm việc với dữ liệu sau thực tế.

(Tôi không nói về tùy chỉnh phiên viết code, tôi đang nói về một lớp học mà bạn sẽ sử dụng thay vì sử dụng $_SESSION trực tiếp.)

+0

I đã thử mọi cách có thể để có được phiên Tất cả hiện tại trên trang web của tôi. Bây giờ, đây là tùy chọn cuối cùng tôi có, đọc dữ liệu phiên hoạt động hiện tại từ tệp và xử lý chúng. –

2

kiểm tra ra, điều này có thể nhấp chuột bạn một cái gì đó

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

Tiếp theo có thể là một cách để đọc dữ liệu phiên từ tập tin phiên

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

Sử dụng lớp học này:

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

Cách sử dụng:

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

Thats Work!

+2

Liên kết với nguồn cho nhận xét này (tín dụng khi đến hạn!): Http://php.net/manual/en/function.session-decode.php#108037 – PureForm

-2
+0

Lưu ý rằng [link only answers] (http://meta.stackoverflow.com/tags/link-only-answers/info) không được khuyến khích. Câu trả lời phải là điểm kết thúc tìm kiếm giải pháp thay vì trỏ đến liên kết thường trở nên cũ theo thời gian. Vui lòng xem xét thêm bản tóm tắt độc lập tại đây, giữ liên kết dưới dạng tham chiếu. – DB5

Các vấn đề liên quan