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"; ...
何が保存またはシリアライズされる前に、問題がで始まるようなので、それはそう。
おそらく
どのように文字列を保存して読み込みますか? –
https://bugs.php.net/bug.php?id=67363 – Calimero
文字列がredisキャッシュに保存されていますが、その前に問題が発生すると思います。上記の私の編集を参照してください。 –