2014-10-03 87 views
0

我已經實現了使用DynamoDB的會話處理程序。它工作正常,除了響應從服務器返回並且我調用json_decode時,嵌套的php序列化會話字符串被破壞。我假設在JSON對象內存儲序列化會話是不兼容的?這是一個逃避問題嗎?PHP會話處理程序存儲會話爲JSON不解碼php序列化正確

問題:

  1. 有沒有辦法來解決這個問題?
  2. 是否有可能使用JSON序列化會話,而不是我假設使用的php serialize()?這可能會解決這個問題。

原來這是當它來自DB的外觀(注:這是很長,所以我一直切到底離我自己)

_sf2_attributes|a:4:{s:34:"_security.secured_area.target_path";s:36:"http://my.domain";s:10:"some_id";s:13:"abc123";s:8:"userData";O:27:"Some\Symfony\Bundle":49:{s:8:"�*�email";s:27:" 

這是調用json_decode後,它的外觀該字符串的JSON對象位於內部:

_sf2_attributes|a:4:{s:34:"_security.secured_area.target_path";s:36:"http://my.domain";s:10:"some_id";s:13:"abc123";s:8:"userData";O:27:"Some\Symfony\Bundle":49:{s:8:" 

它似乎被截斷,其中星號位於原始位置。

+3

如果它是序列化,你應該使用'反序列化()'到它,而不是'json_decode()'解碼。 – Barmar 2014-10-03 04:57:45

+0

請顯示您的代碼。 – sectus 2014-10-03 04:58:21

+0

php會話會自動序列化爲php使用的格式。然後我將它存儲在使用JSON的DynamoDB中,所以我有一個包含php會話的json對象。當我調用json_decode時,它以數組的形式給我提供了一切,但會話字符串被截斷。 – greg 2014-10-03 05:03:46

回答

1

JSON和序列化工作正常PHP

class ClassA 
    { 
    public $publicMember; 
    private $privateMember; 
    protected $protected; 
    } 
$object = new ClassA(); 
var_dump(unserialize(json_decode(json_encode(serialize($object))))); 

但這個問題可能來自DynamoDB: Bug in DynamoDB/DynamoDB Session Handler for PHP (handling of NULL BYTES)。似乎它關閉,但...你可以json_encode之前base64_encode添加額外的包裝

var_dump(unserialize(base64_decode(json_decode(json_encode(base64_encode(serialize($object))))))); 
+0

使用base64進行編碼。我會進一步研究爲什麼沒有base64會失敗。 – greg 2014-10-03 06:18:20

+0

該錯誤特定於適用於PHP的AWS開發工具包版本1,因爲它將SimpleXML用於一切。版本2沒有。但是,空字節看起來確實是問題發生的地方。 – 2014-10-04 06:51:27

+0

你在哪裏應用base64編碼? – 2014-10-04 06:51:47