もう少し大きな ASP を作成したことがある人なら、Session オブジェクトが非常に使いやすく、安全かつ便利であることを知っています。しかし、セッションがどのように機能するかを本当に知っていますか?もう少し大きな ASP を作成したことがある人なら、Session オブジェクトが非常に使いやすく、安全かつ便利であることを知っています。しかし、セッションがどのように機能するかを本当に知っていますか?おそらく、それを理解した後は、この愛され嫌われている物体をあえて使用することはなくなるでしょう。代替方法は少々面倒ではあるが、長期的な検討の結果、実施せざるを得ない。
まず、セッションの利点について説明します。セッションはクライアントのプライベート データ変数を記録するために使用でき、時間範囲内に消えることはありません。これは、特に使用する必要があるメンバーを含むシステムにとって、非常に重要な機能です。メンバーのログイン アカウント、時刻、ステータス、および記録すべき多くのリアルタイム データ (ユーザーのショッピング バスケット内の商品を記録するショッピング システムなど) などの情報は、各ユーザーによって個人的に必要とされ、通常は開発者によって使用されます。 . セッションレコードの処理。
ただし、ASP のセッションは Cookie で構成されており、サーバーはセッションに記録されたすべてのデータを Cookie の形式でユーザーのブラウザに送信します。通常、一般的なブラウザはこれらの Cookie を保存し、ユーザーがリンクをクリックしてサーバーに再度接続するたびに、ブラウザはこれらの Cookie を処理のためにサーバーに送り返します。これはセッションの動作原理であり、データの量が多くなると、データを送信して戻す必要があるため、回線帯域幅を消費するだけでなく、サーバーがオンライン処理や再構成に多くのリソースを費やす必要があるため、パフォーマンスも低下します。初期アクション。ここで、「この機能を使用する必要があるので、それを犠牲にしなければならない」と考えているかもしれませんが、この記事では、一方ではセッションの使用を減らすことも教えています。次に考えられるのは、これも Global.asa Application オブジェクトに属するということです。
アプリケーションは、一時データの記録と処理にも優れています。その機能と使用方法はすべての点でセッションと同じですが、比較すると、記録されるデータはパブリック、つまり任意のユーザーが共有できる可変スペースです。セッションとは異なり、アプリケーションはユーザーにデータを転送せず、次の接続でデータが読み取られるのを待ちます。これに比べて、パフォーマンスはセッションよりもはるかに高速です。
Application オブジェクトはパブリックであるため、最初に行う必要があるのは、セッションをシミュレートする目的を達成するために、各ユーザーがデータを記録するための独自の領域を持てるように、各ユーザーの共通領域を計画することです。現在、次の 2 つのアプローチがあります。
1. サーバーの起動時に事前にユーザー メモリ領域を初期化、作成、割り当てます。通常、この方法ではサーバーの起動直後に多くのリソースが占有されますが、ユーザーが毎回メモリ領域を割り当てる手間も省けます。将来的にはオンラインになります。ただし、この方法には最大人数を制限する必要があり、起動するとすぐに初期化されるため、一定量のメモリ領域の作成しか見積もることができないため、この方法は通常、小規模なプログラムで使用されます。チャットルームなど。
2. この方法は、動的割り当て方法を採用しており、ユーザーが最初にサーバーに接続したときにユーザーへのリソースの割り当てを開始するため、大規模なアプリケーションに適していると考えられます。セッションをシミュレートするこれら 2 つの方法の目的は、セッション リソースの消費を減らすことですが、結局のところ、これらを完全に置き換えることはできません。それでも、セッションを少し使用する必要があります。これにより、少なくとも、セッションの負荷を大幅に軽減できます。サーバ。
最初のオプション
まず最初のソリューションの実装を開始します。アプリケーションはアクティブ化中に初期化されるため、もちろん Global.asa から開始する必要があります。
初期化は完了しましたが、どうやって使うのですか?アカウント番号やログイン時間など、セッションを使用して元々保存されていたデータを、ユーザーがログインする場所に作成したアプリケーション オブジェクトに変更するだけです。
次のようにコードをコピーします。
'未使用のスペースを探します
i = 1 の場合、アプリケーション(ClientMax)へ
Application(User_Status_ & i) = 0 の場合
'ユーザー一時番号
セッション(インデックス) = i
'ロック中
アプリケーション アプリケーション.ロック
'使用済み状態に設定
Application(User_Status_ & i) = 1 '変数データを入れる
アプリケーション(User_Account_ & i) = アカウント
Application(User_Logtime_ & i) = Now()
'ロックを解除します
アプリケーション.ロック解除
出口
終了の場合
次
ユーザー関連の変数データを取得するには、次の手順を実行します。
Response.Write(アプリケーション(ユーザーアカウント_ & セッション(インデックス))
Session を使用しないように言われていないことに気づくかもしれません。では、なぜ上記のソース コードに Session が存在するのでしょうか?前に述べたように、この代替案はセッションを完全に置き換えることはできません。ブラウザは常にサーバーとオンラインであるわけではありません。では、同じ人が次回接続していることをどうやって知ることができるのでしょうか。このとき、私たちはセッションに依存する必要があります。この数値は、銀行内に多数の金庫があることを想像できます。鍵とその鍵には番号が付いており、その鍵の番号を基に係員があなたを自分の金庫に案内することができます。この方法にはまだ改良の余地がありますが、小規模なアプリケーションには十分です。
2 番目のオプション
前のソリューションに関して、カスタマイズされた数値は Session を使用して記録されると考えることもできます。数値に関して言えば、Session オブジェクトは「SessionID」メソッドを提供します。そうです。使用するかどうかに関係なく、サーバーは各ユーザーに番号を自動的に割り当てます。この番号は、Session.SessionID を使用して取得されます。この番号付けは、Session が確実に実行するアクションであり、自分で作成した番号付けプログラムを置き換えるために使用できます。これにより、多くの労力が節約され、拡張性も向上します。ただし、基本的に、上記の最初のソリューションには、人数を制限するチャット ルームなどの小規模なアプリケーションなど、依然として用途があります。次の代替案は、大規模なシステム向けです。
1 秒あたり数百、数千、さらには数万人の訪問者がいる Web サイトの場合、以前のソリューションは間違いなく機能しません。人数の上限を 10,000 に設定すると、サーバーは 10,000 人のユーザーに対して 10,000 の領域を切り出すのに役立ちます。1 つの変数が 32 バイトを占有する場合、10,000 の領域がさらに占有されます。 320000 K (320MB) より、サーバーこれがアクティブ化されるとすぐに、大量のゴミがメモリに詰め込まれ、戦場に出る前にパフォーマンスが大幅に低下することは間違いありません。これらの小さな数字を見て、512 MB が使用できると考えないでください。上記の数値は最小値を想定していますが、メモリを構成するときにサーバーが追加でどれだけのリソースを使用するかは不明であるため、それより多くなるだけであり、少なくなるわけではありません。したがって、唯一の解決策は、ユーザー変数スペースを動的に構成し、ユーザーがサーバーに接続するときにのみ領域を切り出すことです。これにより、事前に巨大なメモリを構成する必要がなくなります。
2 番目のオプションは実装が比較的簡単です。最初のオプションのすべてを破棄してください。ユーザーのログイン場所とその他の便利な場所を変更するだけです。
次のようにコードをコピーします。
'LockApplicationApplication.Lock '変数データを入れる
アプリケーション(User_Account_ & Session.SessionID) = アカウント
Application(User_Logtime_ & Session.SessionID) = Now() 'Application.Unlock のロックを解除します
ユーザー関連の変数データを取得するには、次の手順を実行します。
次のようにコードをコピーします。
Response.Write(アプリケーション(ユーザーアカウント_ & セッション.セッションID))
以前、セッションは非常にリソースを消費するのでセッションを使用しないようにするが、それでも必要な場合にはセッションを使用する必要があると書かれた多くの本を読みましたが、その本にはそれ以上適切な解決策は記載されていませんでした。 Session を置き換える方法を理解したので、それを活用してください。おそらく、私を常に悩ませてきたパフォーマンスの問題は大幅に改善される可能性があります。