3

私はPHPでステートフルなWebアプリケーションを作成しています。このアプリケーションでは、ステートに多くのオブジェクトが含まれている可能性があります。現時点では、これらすべてのオブジェクトを$ _SESSIONに保持し、リクエストの最後にシリアル化しています。セッション全体のシリアル化には数秒かかり、シリアル化解除にはさらに時間がかかるため、これは少し面倒です。

オブジェクトがシリアル化されるのではなく、単にメモリコピーされることを望んでいたので、APCを試してみたかったのです。残念ながら、オブジェクトをフィードapc_store($object)すると、別のプロセスに渡す前にとにかくシリアル化されているようです。(基本的な値と配列はシリアル化せずにメモリにコピーされているという話がありますが、セッションオブジェクトには多くの(循環)参照があるため、これは私にとって適切な解決策ではありません。)

私の質問:すべてのリクエストの後にオブジェクトをシリアル化することなく、PHPでオブジェクトを永続的に保つ既知の方法はありますか?HipHopインタープリターがこれを支援できるという噂を聞いたことがありますが、ネット上で実用的な例は見つかりませんでした。PHPでそれが可能かどうか誰かに教えてもらえますか?

(私は、このプロジェクトをJavaまたはTCP接続なしで永続インスタンスをサポートする別の言語で作成する必要があることを知っています)

4

1 に答える 1

3

オブジェクトを保存(フリーズ)する必要があるときはいつでも、シリアル化する必要があります。これは、ストレージ(APC、セッションファイル、データベースなど)とは無関係です。これは、スクリプトプロセスが終了し、次に開始するときに、オブジェクトを再び実行する必要があるためです。

そのため、物事を「実行状態」に保つことはできません。オブジェクトは常にシリアル化されて保存されます。

PHPのシリアル化は最速ではないことが知られています。これに代わる実装があり、たとえばigbinary PHP拡張機能を使用できます。透過的なセッション処理の隣にシリアル化/逆シリアル化機能を提供します。たぶん、これは実際にあなたのシナリオに役立ちます。

いずれの場合も:セッション内に保存するほど、リクエストの開始時にフリーズを解除またはウェイクアップする必要があり、時間がかかります。

関連:php_binaryシリアル化ハンドラーとは何ですか?

于 2011-07-31T10:47:43.553 に答える