2010-11-23 14 views
15

私はかなりWebプログラミングに新しいです、私は主に過去にデスクトップアプリケーションを作成するためにJavaを使用しています。オブジェクトの永続化を

私はPHPで永続オブジェクトを作成する方法を理解しようとしています。多分永続性が正しい言葉ではないかもしれません、私はセッション変数でそれをシリアル化することによって得られるように、オブジェクトが各クライアントにユニークであることを望んでいません。オブジェクトをサーバー上に作成し、同じオブジェクトに常時アクセスできるようにします。オブジェクトはデータベースにクエリを行い、いくつかのデータを保存します。この方法では、各ページが読み込まれ、PHPコードは毎回データベースにクエリするのではなく、同じ永続オブジェクトからそのデータを取得します。

私は、私が最初に理解していたことは、私が望むものを達成することができるということだったので、現在、オブジェクト作成にシングルトンパターンを使用しています。オブジェクトの一部は配列であり、配列に値を追加するPHPページを実行し、同じページのその値にアクセスすると、それは問題ありません。しかし、私は配列に値を追加し、値にアクセスする別のページをロードすると、配列は空に戻っています。

これは可能ですか?私はデータベースをあまりにも多くクエリが悪いと思って、過度に反応していますか?時には、1秒間に20人のユーザーがデータを要求することがあります。毎回dbを照会するのはばかげているように感じます。 JavaはないとしてPHPが持続性の概念がありません

+2

1秒あたりのユーザーリクエスト数は多くありません – Ben

+0

ページあたりの負荷が20を超えるユーザーがそれほど多くありません。それは重要な点ではありません。主な問題は、データ構造が変更されたときにデータベースを維持することです。 – Tarion

答えて

9

通常、データベースを使用して永続化します。それがボトルネックであれば、データのキャッシュを開始します。例えば、memcached、またはWebサーバー上の配列serializedのローカルファイルです。

+2

簡単なクエリでは、同じデータに対してデータベースを繰り返しクエリする方が高速ですが、オブジェクトをキャッシュしますか?クエリ自体に0.1秒かかるとします。通常は、より高速のファイル+シリアル化オブジェクトまたはデータベース+オブジェクトの集団ですか? –

+0

実際の問題が発生するまでは、パフォーマンスについては気にしないでください。 – Tarion

+5

パフォーマンスについては常に注意が必要です。それはすぐに正しいことを学ぶ時間の束を余裕ができます。私は他の誰かが作ったプロジェクトを一度調整しなければなりませんでした。これはPHPで作成され、パフォーマンス上の問題がありました。私は解決するのに非常に時間がかかりました。彼はすぐにそれをやっていただろうよりも長く。 –

13

ありがとう:JVMは、HTTPリクエストの間のメモリに永続化するJavaアプリケーションが可能になります。 Webサーバーは新しいHTTPリクエストが提供されるたびに新しいPHPプロセスを作成し、オブジェクトの静的変数はリクエスト間でデータを保持しません。

永続データを格納するデータベースを使用します。 Webプログラミングは同時実行性に重点を置いているため、データベースの問合せを心配する必要はありません.20秒はほとんどありません。データベースの限界に達した場合は、読み取り専用のスレーブを追加してキャッシングレイヤーを追加するか、または「スケールアウト」するハードウェアを追加するかを選択できます。

0

Webプログラミングにおけるデータの永続性は、Cookie /セッションの使用とCookie /セッション変数のWebページ呼び出しの使用を通じて行われます。理論的には、これらの変数にはあらゆる種類のデータを格納することができますが、実際の目的では必要なオブジェクトを識別/再構築するために必要なより重要なデータ(より多くのトークンを見てください)サーバーとブラウザーから。

0

memcachedをよくご覧ください。サーバーの負荷とパフォーマンスの機能について言えば、有用な指標はページ/秒です。専用サーバーがあり、最適化されていないものの、非常に集中的な処理が行われている場合は、毎秒5ページしか処理できません。データキャッシングを利用することは、それを3倍から10倍に増やす大きな方法です。しかし、データがどれくらい失効するかは、常にトレードオフです。ページあたりのその他の接続(イメージ、CSSなど)、ファイルの入出力、その他のネットワークアクティビティ、最後に実際のパフォーマンスなど、他のパフォーマンス制限要因を適切に理解(定量化)するためには、サイトをテストする必要があります。

+0

p.s memcahcedは複数のサーバーをサポートしており、非常によくテストされ、安定した拡張機能です。 apcは1つのサーバー上で素晴らしいですし、カスタム使用をサポートしますが、memcachedは分散アプリケーションについて話しても勝ちます。しかし、別のページがそれまでに値を変更した可能性があるため、インクリメントを「ロック」ロジックとして使用して面白い作業を行う必要があります。 memcachedに依存してうまく動作しますが、このインタフェースをコーディングする際に注意して、変更されていないとみなさず、新しいデータを上書きします。 http://www.php.net/manual/en/memcache.increment.php – zanlok

0

シングルトンの使用を中止し、依存性注入を使用します。

DataMapper(http://www.martinfowler.com/eaaCatalog/dataMapper.html)を使用し、動的プロパティを使用してオブジェクトにアタッチすることをお勧めします。データマッパーが永続性を処理するようにします。

$CS = new CookieStorage(); 
$SS = new SessionStorage(); 
$FS = new FileStorage('config/object.db'); 

$DM = new ObjectDataMapper($FS); 

$O = new Object($DM); 

$Object->DynamicProperty = 1; 

DynamicPropertyが自動的に持続しますと、自動的にファイルobject.dbからロードされます。クラス定義:

class Object 
{ 
    public function __construct(MapperInstance $Storage = NULL) 
    { 
     $this->setMapper($Storage?: new ObjectDataMapper(new FileStorage('config/object.db'))); 
    } 

    public function __get($name) 
    { 
     $this->_Mapper->getProperty($name); 
    } 

    public function __isset($name) 
    { 
     $this->_Mapper->isProperty($name); 
    } 

    public function __set($name, $value) 
    { 
     $this->Mapper->setProperty($name, $value); 
    } 
} 
0

オブジェクトを現在のセッションに格納することは可能です。今度は、オブジェクト自体を保存して再作成できる基本クラスを作成してください。派生したオブジェクトもすべて永続化されます。

あなたはここで参照することもできます。persistent base class and example

を限り私はセッションがRAMに格納されて知っているので、永続性を達成するために、ディスクにオブジェクトをシリアル化よりも高速でなければなりませんよう。

+0

このページへのリンクはありません。 – Blip

+0

ありがとうございます。ちょうどリンクを更新しました:) – tswaehn

1

これは最善の解決策ではありませんが、SESSIONSをこの問題として使用できます。

class SomeObject{ 

    public function __costructor{ 
     $_SESSION['object'] = serialize($this); 
    } 

} 

と別のページに、あなたは単純にして、オブジェクトを呼び出すことができます。勿論、このアプローチは最も簡単なようだけど

$object = unserialize($_SESSION['object']); 

。これは、最大限の用心が付属していなければならない:

  1. は、多くのユーザーが同時にこれらの各セッションを求めるようにサーバーのトラフィックに応じて、セッションのサイズが大きすぎてはならないことを知っています。あなた自身の裁量でサイズを拡大してください。

  2. セッションが完了しないように常にシリアライズしてシリアル化しないようにします。は正しく動作しません。

これまでボートを帆走したことは何ですか?あなた自身の心を凝らした分析でそうしてください。 goodluck

関連する問題