PHP キャッシュ技術を使用すると、「PHP クラス x にはアンシリアライザーがありません」というプロンプトが表示されます。この問題の解決策を紹介します。
PHP が安定版 5.3.8 にリリースされたので、会社の実稼働サーバーの PHP を 5.2.17 から 5.3.8 にアップグレードする予定です。テスト サーバーでデバッグしているときに、次のような奇妙な問題を発見しました。
デュアル PHP 環境をインストールした後、元々 5.2.17 で正常に実行されていたコードがエラーを報告し、PHP クラスに有益な情報がありませんでした。評判の悪い問題に遭遇したようだったので、デバッグとステップの確認を開始しました。 memcache を使用してデータを取得する部分でエラーが報告され、クラスの最適化関数がデシーケンスされていないことがわかりました。コードは 5.3.8 で実行されます。唯一の手がかりはこの逆シリアル化プロンプトなので、PHP 公式のシリアル化情報を検索したところ、最初にシリアル化インターフェイス Serializable の紹介を見つけました。ここで、インターフェイスには、逆シリアル化するときに呼び出す口実として使用される unserializ メソッドがあることに気付きました。同時に、PHP の memcache 拡張機能は、PHP データ オブジェクトが memcache に格納されるときにシリアル化します。使用しているオブジェクトが Serializable インターフェイスを実装していないことは問題ですか?コードを追跡したところ、memcache に保存したクラスが Array_Object クラスを継承していることがわかり、公式の Array_Object 紹介ページにアクセスして、確かにそのとおりであることがわかりました
上に示したように、Array_Object は 5.3.0 以降 Serializable インターフェイスを実装していますが、5.2 では実装されていません。現時点で、この問題の原因は次のように分析されています。
このプログラムは 2 つのバージョンの PHP で実行されますが、同じ memcache キャッシュ プールを使用します。最初にテストしたのはバージョン 5.3.8 でした。そのため、保存されていたのは PHP5.3 の Array_Object オブジェクトでした。このオブジェクトは 5.3 で通常どおりシリアル化および反転できます。これは、memcache にすでにキャッシュ オブジェクトが存在するため、5.2 で読み取られるのは 5.3 でシリアル化された Array_Object オブジェクトですが、5.2 では Serializable を実装した場合は Array_Object がありません。インターフェイスでは、逆シリアル化中にエラーが発生するため、「PHP クラス x にはアンシリアライザーがありません」というメッセージが表示されます。
この問題の解決策は非常に簡単です。データ汚染とバージョン互換性の問題を避けるために、プログラムごとに異なるキャッシュ プールを使用します。
http://www.bkjia.com/PHPjc/632184.html