ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルに基づいて memcache を使用してセッションを保存する方法の詳細な説明

PHP_PHP チュートリアルに基づいて memcache を使用してセッションを保存する方法の詳細な説明

WBOY
WBOYオリジナル
2016-07-21 15:03:29676ブラウズ

Web サーバーの PHP セッションはすべて memcached であるため、ディストリビューターがどの Web サーバーに IP 接続を割り当てても問題はありません。設定方法は非常に簡単で、PHP 設定ファイルにステートメントを追加するだけです。ただし、最初に memcache モジュールをインストールする必要があります

1. memcache を使用して保存するようにセッションを設定します
方法 I: php.ini でグローバルに設定します
session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"
方法 II: いくつか。ディレクトリ内の htaccess:
php_value session.save_handler "memcache"
php_value session.save_path "tcp://127.0.0.1:11211"
方法 III: またはアプリケーション内:
ini_set("session.save_handler ", "memcache") );
ini_set("session.save_path", "tcp://127.0.0.1:11211");
複数の memcached サーバーを使用する場合は、カンマ "," で区切って、Memcache::addServer () で使用します。このドキュメントでは、「tcp://host1:port1?persistent=1&weight=2, tcp:/」のような追加パラメータ「persistent」、「weight」、「timeout」、「retry_interval」などを取得できます。 /ホスト2:ポート2」。
インストールされた PECL が memcached (libmemcache ライブラリを使用するもの) の場合、設定は
ini_set("session.save_handler", "memcached"); // memcache ではなく memcached です
ini_set("session.save_path") , "127.0 .0.1:11211"); // tcp:
を使用しないでください。

2. memcached を起動します:
memcached -d -l 127.0.0.1 -p 11212 -m 128
または、Memcached のサーバー側を起動します:
memcached -d -m 100 -u root -l 192.168.36.200 -p 11211 - c 256 -P /tmp/memcached.pid
# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid

引用
-d オプションはデーモンプロセスを開始します、
-m は Memcache に割り当てられたメモリ量 (MB 単位)、ここでは 100MB、
-u は Memcache を実行しているユーザー、ここは root、
-l は監視対象サーバーの IP アドレスは 192.168.36.200 に指定しました。ここでは Memcache のポートを設定します。ここでは 11211 を使用します
-c オプションは、実行できる同時接続の最大数です。ここでは、サーバーの負荷に応じて 256 に設定します。
-P は Memcache を保存するための pid ファイルを設定し、/tmp/memcached.pid に保存します。

3. プログラム内のセッションストレージに memcache を使用します

例でテストします:

コードをコピーします

コードは次のとおりです: session_start(); !isset($ _SESSION['TEST'])) {
using using use ‐ ‐ ‐ using using _SESSION['TEST']-- を出力するには;br>";
print $_SESSION[' TEST3'];
print "

";
print session_id();



を使用して Memcached に移動します:




次のコード:


& lt;? PHP
$ memcache = memcache_connect ('Localhost', 11211) get ('19216821213c65cedec65b0883238c278eeb573e077'); ->set('ああああ', 'こんにちはみんな');
var_dump($memcache->get('aaaa'));
string(37) "TEST|i:1177556731;TEST3|i:1177556881;" が表示されます。
このような出力は、セッションが正常に動作していることを証明します。
memcache を使用してセッションを保存すると、ファイルよりも読み取りと書き込みがはるかに高速になり、複数のサーバーが同じ memcached サーバーのグループを使用するように設定するだけで、余分な作業が軽減され、より便利になります。セッション データがメモリに保存されるため永続性に欠けるという欠点がありますが、セッション データにとっては大きな問題ではありません。
======================================
通常、セッションはサーバー側に保存されます。テキスト ファイルの形式。 Seesion が使用されている場合、または PHP ファイルが Session 変数を呼び出したい場合は、session_start() 関数を使用して、Session を呼び出す前に Seesion を開始する必要があります。他に何も設定する必要はありません。PHP が自動的にセッション ファイルを作成します。デフォルトのセッション ストレージ パスは、サーバーのシステム一時フォルダーです。
しかし、大量のデータを含むセッションが発生した場合、ファイルベースのセッション アクセスを使用する際のボトルネックは、ディスク IO 操作である可能性があります。現在では、Memcached を使用してセッション データをメモリ経由で直接保存するため、効率が大幅に向上します。 。 読み取りと書き込みの速度はファイルよりもはるかに速く、複数のサーバーがセッションを共有する必要がある場合は、これらのサーバーが同じ memcached サーバーのグループを使用するように構成するだけで、追加の作業負荷が軽減されます。

欠点は、マシンがダウンするとセッション データがメモリに保存されることです。ただし、セッション データにとっては深刻な問題ではありません。
memcached を使用してセッションを保存するにはどうすればよいですか?基本的な設定手順は次のとおりです:

1. memcached をインストールします
phpinfo 出力の「登録された保存ハンドラー」に「files user sqlite」が表示されます。

2. 構成ファイルを変更します、a. php.ini のグローバル設定 (* サーバーの再起動が必要です)

session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"

b . または、特定のディレクトリ内の .htaccess:
php_value session.save_handler "memcache"
php_value session.save_path "tcp://127.0.0.1:11211"

c アプリケーション内にもあります:
ini_set ("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211");

注: 複数の memcached サーバーを使用する場合はカンマを使用してください" ," Memcache::addServer() ドキュメントで説明されているように、「tcp:// /host:」のような追加パラメータ「persistent」、「weight」、「timeout」、「retry_interval」などを取ることができます。 port?persistent=1&weight=2,tcp://host2 :port2″ 。

3. memcached を起動します
memcached -d -m 10 -u root -l 127.0.0.1 -p 11211 -c 256 -P /tmp/memcached.pid

4. セッションの作成をテストします

コードをコピーします コードは次のとおりです:
//set_session.php
session_start();
if (!isset($) _SESSION['admin' ])) {
$_SESSION['TEST'] = 'wan';
}
print $_SESSION['admin'];
print "n";
print session_id();
?>


5 . sessionid を使用して memcached をクエリします
コードをコピーします コードは次のとおりです:
//get_session.php
$mem = new Memcache;
$mem ->connect("127.0 .0.1", 11211);
var_dump($mem->get('0935216dbc0d721d629f89efb89affa 6'));
?>


コードをコピーします コードは次のとおりです以下:
[root@localhost html] # /usr/local/webserver/php/bin/php -f get_session.php


出力結果:
string(16)
"admin|s:3:"wan";"
セッションが正常に動作していることを証明します。
============================
memcache を使用してセッションを保存すると、読み取りおよび書き込み速度の点でファイルよりもはるかに高速になるはずです。多くの場合、2 つのサーバーがセッションを共有する必要がある場合は、同じ memcached サーバーのグループを使用するようにこれらのサーバーを構成するだけで、追加の作業負荷が軽減されます。欠点は、セッション データがメモリに保存されるため、永続的に保存できないことです。永続的に保存したい場合は、ストレージとして Memcachedb を使用するか、ストレージとして Tokyo Tyrant + Tokyo Cabinet を使用することを検討できます。

セッションの有効期限が切れているかどうかを確認するにはどうすればよいですか? php.ini には Session.cookie_lifetime オプションがあります。これは、SessionID がクライアント Cookie に保存される時間を表します。デフォルト値は「0」で、ブラウザが閉じられるとすぐに SessionID が無効になることを意味します。 Memcached に保存されたセッションが有効であるかどうかに関係なく、依然として有効です (Memcached に保存されたセッションは、セッション データの有効期限が切れていない場合でも、Memcached の内部メカニズムを使用して処理されます。また、クライアントの SessionID の有効期限が切れているため、このキーには基本的にはありません) Memcached の LRU 原理を使用して、使用される可能性があります。Memcached のメモリが十分でない場合は、期限切れの最も古い未使用のデータが新しいデータに置き換えられます。SessionID の有効期限が切れているため、新しい SessionID がクライアント上で再生成されます。

Memcached に保存される最長データは、Memcached の操作時間に基づきます。つまり、キーに対して関連する操作を再度実行した場合に限ります。 (set 操作など)、有効期間がリセットされると、PHP マニュアルで説明されているように、この時点でこのキーに対応するデータの有効期間が再計算されます

アイテムの有効期限がゼロに等しい場合。 、アイテムは期限切れになりません。Unix タイムスタンプまたは現在時刻から始まる秒数を使用することもできますが、後者の場合、秒数は 2592000 (30 日) を超えることはできません

Memcached の主なキャッシュ メカニズムは次のとおりです。 LRU (最も最近使用されていない) アルゴリズム + タイムアウトが失敗します。データを memcached に保存する場合、データをキャッシュ内に保持できる期間を指定できます。 memcached のメモリが不十分な場合は、期限切れのスラブが最初に置き換えられ、次に最も古い未使用のスラブが置き換えられます。
============================
Web アプリケーションが Saas モードで大規模アクセスを使用するには、アプリケーションのクラスター展開が必要ですクラスターの展開を実装するには、主に、複数のアプリケーション サーバー間のセッションを統合するためのセッション共有メカニズムの実装が必要です。Tomcat などのほとんどのサービスは、セッション レプリケーション テクノロジーを使用してセッション共有を実現します。 1) 技術的な複雑さ、同じ種類のミドルウェア間 (例: tomcat と tomcat の間) で完了する必要があります。
(2) ノードの数が増加し続けると、特に次の場合にセッション レプリケーションによって生じるパフォーマンスの損失が急速に増加します。セッションが保存される オブジェクトが大きくなり、オブジェクトが急速に変化する場合、この機能によって Web アプリケーションの水平方向の拡張が制限されます。最初に思いつくのは、セッション管理を集中化することです。データベースはセッションを集中的に保存するために使用されますが、データベース内のファイルの保存はメモリよりも桁違いに遅いため、データベース システムの負荷が必然的に増加します。そのため、高速かつ高速なサービスが必要になります。リモートに保存でき、中央に保存する必要があるため、memcached が頭に浮かびました

memcached は何をキャッシュできますか?

Memcached は、統合された巨大なハッシュ テーブルをメモリ内に維持することにより、画像、ビデオ、ファイル、データベースの検索結果など、さまざまな形式でデータを保存するために使用できます。


memcached は速いですか?

とても速いです。 Memcached は、libevent (可能であれば Linux では epoll) を使用して、開いている接続のバランスをとり、ノンブロッキングのネットワーク I/O を使用し、内部オブジェクトの参照カウントを実装します (オブジェクトがさまざまなクライアントに対して処理できるようにします)。さまざまな状態で)、独自のページ ブロック アロケーターとハッシュ テーブルを使用するため、仮想メモリは断片化されず、仮想メモリ割り当ての時間計算量は O(1) であることが保証されます。

使用中のいくつかの問題と改善のアイデアに注意してください:
1. ユーザーセッションがキャッシュからクリアされる問題が発生しないように、memcache のメモリは十分な大きさである必要があります (memcached のオブジェクト終了メカニズムはオフにすることができます)。 。
2. セッションで書き込みよりも読み取りがはるかに多い場合は、memcache の前に Oscache などのローカル キャッシュを追加して、memcache での読み取り操作を削減し、それによってネットワークのオーバーヘッドを削減し、パフォーマンスを向上させることができます。
3. ユーザーが多い場合は、memcached グループを使用し、set メソッドを通じて特定の memcached サーバーに hashCode を挿入できます。

セッションをクリアするにはいくつかのオプションがあります:


(1)早朝の人の最も少ない時間に、memcached を一度クリアします。 (簡易)
(2) キャッシュに保存されているオブジェクトの有効期限を設定し、フィルターで sessionId の値を取得し、memcached 内のオブジェクトを定期的に更新する 長期間更新されていないオブジェクトは自動的にクリアされます。 (比較的複雑でリソースを消費します)

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/327847.html技術記事 Web サーバーの PHP セッションはすべて memcached であるため、ディストリビューターがどの Web サーバーに IP 接続を割り当てても、設定方法は非常に簡単で、PHP 設定ファイルに記述するだけで問題ありません。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。