2017-09-19 4 views
2

Google App Engine(PHP 5.5.38を使用)でアプリケーションを実行していて、クエリ結果をキャッシュするためにLaravelパッケージを使用しています。PHP serialize()がstdClassオブジェクトを適切にシリアル化していません

これは、同様のプロジェクトのためによく働いたが、この1のために、私はそのような、などのエラーを取得「アンシリアライズ():オフセット14 860のバイトでのエラー」(数字は連載されたものによって異なります。)

a:1:{i:0;O:8:"stdClass":27:{s:2:"id";i:2;s:10:"first_name";s:4:"Zach";... 
:私はローカルでアプリケーションをテストするとき、すべてが正常に動作し、シリアル化されたデータは次のようになりますことを発見し

public function encode($data){ 
    return serialize($data); 
} 

public function decode($data){ 
    return unserialize($data); 
} 

エラーは、これらの二つの機能を持つクラスで発生します

しかし、私は同じデータでのApp Engine上でそれを実行すると、それはこの返します

a:1:{i:0;O:8:"@*lass":27:{s:2:"id";i:2;s:10:"first_name";s:4:"Zach";... 

それはここに表示されない場合がありますが、「*」(++メモ帳では、彼らが現れるの隣に見えない文字があります[ENQ]と[DLE])。

シリアル化されたデータにstdClassの代わりに@ * lassが含まれているため、unserialize()の呼び出しが失敗すると思われますが、何が原因かわかりません。私はstr_replaceを使ってみたが、最初はうまくいったが、すべてではなかった。また、PHPがデフォルトのcharsetとしてUTF-8を使用していることを確認しました。

EDIT:エンコード機能を変更して、トラブルが始まる瞬間を特定しようとしました。 は、私が今持っている:それは、サーバー上で実行されますとき

public function encode($data) 
{ 
    $serialized = serialize($data); 
    try{ 
     unserialize($serialized); 
    } catch (\Exception $ex) { 
     var_dump($serialized); 
     die; 
    } 
    return $serialized; 
} 

そして、それは出力:

a:1:{i:0;O:8:"@*lass":27:{s:2:"id";i:2;s:10:"first_name";s:4:"Zach"; ... 

何が保存またはシリアライズされる前に、問題がで始まるようなので、それはそう。

おそらく
+0

どのように文字列を保存して読み込みますか? –

+0

https://bugs.php.net/bug.php?id=67363 – Calimero

+0

文字列がredisキャッシュに保存されていますが、その前に問題が発生すると思います。上記の私の編集を参照してください。 –

答えて

1

ない理想的な修正が、これが動作しているようです...

public function encode($data) 
{ 
    return serialize(json_decode(json_encode($data), true)); 
} 

public function decode($data) 
{ 
    return json_decode(json_encode(unserialize($data))); 
} 

問題がstdClassのオブジェクトの配列をシリアル化から来るように見えたので、私はそれが連想配列にはstdClassを変換するのに役立つだろう考え出し。

関連する問題