PHP では、オブジェクトの大規模な配列 (100000 以上のオブジェクト) でserialize
/を使用するのに非常に苦労しています。unserialize
これらのオブジェクトは、さまざまな種類のオブジェクトにすることができますが、すべて基本クラスの子孫です。
どういうわけかunserialize
、オブジェクトの配列で使用すると、オブジェクトの約 0,001% が間違って生成されます! 代わりに、まったく異なるオブジェクトが生成されます。これはランダムに発生するのではなく、毎回同じオブジェクトで発生します。しかし、配列の順序を変更すると、別のオブジェクトで発生するため、これはバグのように見えます。
json_encode
/に切り替えましたが、これは常にオブジェクトのクラスとしてjson_decode
使用されることがわかりました。stdClass
各オブジェクトのクラス名をプロパティとして含めることでこれを解決し、このプロパティを使用して新しいオブジェクトを構築しましたが、このソリューションはあまりエレガントではありません。
var_export
withを使用するとeval
問題なく動作しますが、他の方法よりも約 3 倍遅くなり、より多くのメモリを使用します。
今私の質問は次のとおりです。
- で作成されたバグ/間違ったオブジェクトの原因は何
unserialize
ですか? json_decode
クラスが自動的にjson内に保存されるように、オブジェクトの配列で使用するより良い方法はありますか?- PHPでオブジェクトの大きな配列を読み書きするための他の方法さえありますか?
アップデート
msgpack_serialize
(php 拡張子、 の代替serialize
) を使用すると、同じ種類のエラーが発生するため (しかし、不思議なことに、同じオブジェクトが間違って生成されるわけではありません!) 、配列データに何か奇妙なことがあるに違いないと考え始めています。
更新 2
解決策が見つかりました:serialize
配列全体で行うのではなく、各オブジェクトで最初serialize
に実行してからbase64_encode
、シリアル化された各オブジェクトをテキストファイルの個別の行として保存します。file()
このようにして、オブジェクトの配列全体を生成し、 withunserialize
およびを使用して各オブジェクトを反復処理できますbase64_decode
。これ以上エラーは発生しません!