ホームページ >バックエンド開発 >PHPチュートリアル >Windows_PHP チュートリアルで memcache を構成する方法
以前「PHP で SESSION データのマルチサーバー共有を実装する」という記事を書きましたが、その記事内の SESSION はデータベースチュートリアルを使用して保存されており、同時アクセス数が多いとサーバーに非常に負荷がかかります。 memcached を使用すると、この問題をうまく解決できます。
ユーザーが Web ページにアクセスすると、memcached に現在のユーザーの SESSION データがあるかどうかを確認し、データが存在する場合は session_id() を一意の識別子として使用します。データが存在しない場合は、それが直接返されます。再度データベースに接続し、SESSION データを取得してこれを使用します。データは次回使用するために memcached に保存されます。
現在の PHP 操作が終了する (または session_write_close() が使用される) と、My_Sess::write() メソッドが呼び出され、データベースにデータが書き込まれます。この場合も、このメソッドは毎回データベース操作を実行します。最適化する必要があります。ユーザーがページに入ったときにグローバル変数を使用して SESSION データを記録し、このデータを write() メソッドで比較して、書き込みたい SESSION データと同じかどうかを確認します。異なる場合は、に接続します。同時に、memcached 内の対応するデータが削除されている場合は、SESSION データが変更されていないことを意味するため、何も操作せずに直接返すことができます。 ;
では、ユーザーの SESSION 有効期限を解決するにはどうすればよいでしょうか? memcached の add() メソッドには有効期限パラメータ $exp があることを覚えていますか?このパラメータ値を SESSION の最大生存時間未満に設定するだけです。また、常にオンラインのユーザーの場合は、条件が満たされた場合にデータベースのデータが更新されるように、write() メソッドで解決できます。
memcache サーバー インストール パッケージを C: memcached フォルダーに解凍した後、cmd コマンド ウィンドウを使用してインストールします。
1>開始>実行: CMD (OK)
2>cd C:memcached (Enter)
3>memcached -d install (Enter を押してインストールを実行します)
4>memcached -d start (Enter を押します。このステップにより memcache サーバーが開始されます。デフォルトでは、64M メモリが割り当てられ、ポート 11211 が使用されます)
現時点では、memcacheサーバーは正常に使用できます。
サーバー上で実行:
# ./memcached -d -m 2048 -l 10.0.0.40 -p 11211
これにより、2G のメモリを占有するプロセスが開始され、リクエストを受信するためにポート 11211 が開きます。 32 ビット システムは 4G メモリのアドレス指定のみを処理できるため、4G を超えるメモリを備えた PAE を使用して 2 ~ 3 つのプロセスを 32 ビット サーバー上で実行し、異なるポートでリッスンできます。
-d オプションはデーモンプロセスを開始します。
-m は Memcache に割り当てられたメモリ量 (MB 単位) で、ここでは 10MB です。
-u は Memcache を実行しているユーザーです。私はここでは root です、
-l はリスニングサーバーの IP アドレスです。複数のアドレスがある場合は、サーバーの IP アドレス 192.168.105.73 を指定しました。
-p は、Memcache がリッスンするポートを設定するためのもので、ここでは 12000 を設定します。できれば 1024 より上のポートを設定します。
-c オプションは、実行できる同時接続の最大数です。ここでは、サーバーの負荷に応じて 256 に設定します。
-P は Memcache を保存するための pid ファイルを設定し、/tmp/memcached.pid に保存します。
memcache サーバーのセキュリティ:
Memcache サーバーは、クライアントに接続した直後に動作し、サーバーが直接インターネットに公開されると、最悪の場合、データが漏洩して関係のない人に閲覧される可能性が高くなります。サーバーが侵入される可能性があり、未知のバグやバッファ オーバーフローが存在する可能性があります。そのため、その危険性は予見できます。セキュリティ上の理由から、ハッカーの侵入やデータ漏洩を防ぐための 2 つの提案を次に示します。
1> 内部ネットワーク IP を使用して Web アプリケーション サーバー呼び出しを行うことはできません (memcache サーバーをサーバー 192.168.1.55 に配置するなど)。
2>ポートを11200に変更するなど変更します
3>1024M (1G メモリ) などのメモリを割り当てます
方法は次のとおりです。
1>開始>実行: CMD (OK)
2>cd C:memcached (Enter)
3>memcached -m 1024 -p 11200 -l 192.168.1.55 (入力)
この時点ではコマンド ラインは C:memcached> 状態に戻らず、実際に memcache サーバーは静かに stop 状態に変化することに注意してください。このウィンドウは閉じることができません。新しいコマンドウィンドウを開きます
4>開始>実行: CMD (OK)
5>cd C:memcached (Enter)
6>memcached -d start (Enter) を押すと、この cmd ウィンドウを閉じることができます。
新しく構成された memcache サーバーが使用できるようになります。
上記の方法はデフォルト構成の変更の問題を解決しますが、閉じることのできない cmd ウィンドウが常に存在します。閉じないと、ポート 11211 のデフォルト構成に戻ります。より良い解決策は、サービスのレジストリ構成を変更することです:
1>スタート>実行: regedit (Enter)
2> レジストリで見つかりました: HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesmemcached Server
3>デフォルトの ImagePath キー値は次のとおりです: "c:memcachedmemcached.exe" -d runservice、次のように変更します: "c:memcachedmemcached.exe" -d runservice -m 512 -p 11200 -l 192.168.1.55 (OK、登録を閉じます)フォーム)
4>マイ コンピュータ (右クリック) > [管理] > [サービス] memcache サービスを見つけて、一度再起動して有効にします。
現時点では、同じネットワーク セグメント内のコンピューターは引き続きこの memcache サーバーを使用でき、指定された Web アプリケーション サーバーの使用はファイアウォールを介して制限されます。たとえば、Web サーバー 192.168.1.2 に Memcache サーバーへのアクセスを許可するだけで、一部の不正アクセスを効果的に防止できます。これに応じて、セキュリティを強化するために他のルールを追加することもできます。
Memcache サーバーは、クライアントに接続した直後に動作し、サーバーが直接インターネットに公開されると、最悪の場合、データが漏洩して関係のない人に閲覧される可能性が高くなります。 Mecache は root 権限で実行されるため、サーバーに侵入される可能性があり、未知のバグやバッファ オーバーフローが存在する可能性があります。そのため、その危険性は予見できます。セキュリティの観点から、ハッカーの侵入やデータ漏洩を防ぐために 2 つの提案をさせていただきます。
イントラネットアクセス
イントラネットの形式で 2 つのサーバー間 (通常は Web サーバーと Memcache サーバー間) にアクセスするのが最善です。一般的なサーバーには 2 つのネットワーク カードがあり、1 つはインターネットを指し、もう 1 つはイントラネットを指します。次に、Web サーバーがイントラネット ネットワーク カードを介して Memcache サーバーにアクセスできるようにし、Memcache サーバーの IP アドレスと IP アドレスを監視します。イントラネットのポートとイントラネット アクセスにより、他の不正アクセスを効果的に防止できます。
# memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid
Memcache サーバーは、イントラネット上の 192.168.0.200 IP の 11211 ポートをリッスンするように設定されており、1024MB のメモリを占有して、最大 1024 の同時接続を許可します
ファイアウォールを設定する
ファイアウォールはシンプルで効果的な方法です。両方のサーバーがインターネットに接続されており、外部 IP 経由で Memcache にアクセスする必要がある場合は、ファイアウォールまたはプロキシ プログラムを使用して不正なアクセスをフィルタリングすることを検討できます。
一般に、Linux では、FreeBSD で iptables または ipfw を使用して、一部の不正アクセスを防止するルールを指定できます。たとえば、Web サーバーに Memcache サーバーへのアクセスのみを許可し、他のアクセスをブロックするように設定できます。
#iptables -F
# iptables -P 入力ドロップ
# iptables -A INPUT -p tcp -s 192.168.0.2 –dport 11211 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.2 –dport 11211 -j ACCEPT
上記の iptables ルールは、192.168.0.2 Web サーバーのみに Memcache サーバーへのアクセスを許可します。これに応じて、セキュリティを強化するために他のルールを追加することもできます。
多くの場合、キャッシュされたクエリの数、ヒット率など、サーバー上の Memcached の動作を監視する必要があります。でも見つけました
その memcached-tool は Linux 上の Perl で書かれており、Windows で使用できるかどうかは試していません。その後、Telnet を使用する簡単な方法を見つけました。
2. ポートに接続した後、stats コマンドを入力して、Memcached サーバーの動作を説明するパラメータを取得します。
STAT pid 4356 サーバープロセス ID
STAT 稼働時間 56625 サーバー実行時間、単位は秒
STAT 時間 1225249079 サーバーの現在の UNIX 時間
STAT バージョン 1.1.0 サーバーのバージョン番号
STAT ポインターサイズ 64
STAT rusage_user 151.845489 このプロセスの累積ユーザー時間 (秒: マイクロ秒)
STAT rusage_system 121.667603 このプロセスの累積システム時間 (秒: マイクロ秒)
STAT バッファサイズ 4096
STAT curr_connections 13 接続数
STAT total_connections 54136 サーバーが実行されてから受け入れられた接続の合計数
STAT connection_structs 318 サーバーによって割り当てられた接続構造の数
STAT cmd_get 100595 取得リクエストの総数
STAT cmd_set 6510 ストレージリクエストの総数
STAT get_hits 96543 成功したリクエストの総数
STAT get_misses 4052 失敗したリクエストの総数
STAT bytes_read 4427679 サーバーによってネットワークから読み取られた合計バイト数
STAT bytes_writing 6585596 サーバーによってネットワークに送信された合計バイト数
1>、稼働時間は memcached の実行秒数です、
2>、cmd_get はキャッシュをクエリする回数です。
3>. これら 2 つのデータを除算して、1 秒あたりの平均キャッシュ リクエスト数を取得します。最近 niupu のトラフィックが非常に少ないため、平均リクエストは 1 秒あたり 1 回以上です
これほど大きなプレッシャーがある場合、ファイル システム キャッシュを使用することに問題はありませんが、memcached を使用する利点はまったく反映されません。
4>. 次の cmd_set は key=>value が設定される回数です。 memcached 全体は大きなハッシュであり、cmd_get を使用してコンテンツを見つけることはできません
コンテンツに応じて、cmd_set が呼び出され、キャッシュに書き込まれます。
5> の後に get_hits (キャッシュ ヒット数) が続きます。キャッシュ ヒット率 = get_hits/cmd_get * 100%。
6>。次の get_misses 数と get_hits は cmd_get と等しくなります。
7>、total_itemscurr_items は現在キャッシュ内にあるキーと値のペアの数を表します
。
8>. 図では、total_items == cmd_set == get_misses ですが、利用可能な最大メモリが使い果たされると、memcached は一部のコンテンツを削除し、上記の式は当てはまりません
さて、これがテストコードです
// memcached クラス ファイルが含まれています
require_once('memcached-client.php');
// オプション設定
$options = 配列(
‘servers’ => array(‘192.168.1.1:11211’), //memcached サービスのアドレスとポート。複数の配列要素を使用して複数の memcached サービスを表すことができます
‘debug’ => true, //デバッグをオンにするかどうか
'compress_threshold' => 10240, //データがバイト数を超えた場合に圧縮します
'persistant' => false //永続的な接続を使用するかどうか
);
// memcached オブジェクト インスタンスを作成します
$mc = 新しい memcached($options);
// このスクリプトで使用される一意の識別子を設定します
$key = 'マイキー';
// オブジェクトを memcached に書き込みます
$mc->add($key, 'いくつかのランダムな文字列');
$val = $mc->get($key);
echo “n”.str_pad(‘$mc->add() ’, 60, ‘_’).“n”;
var_dump($val);
// 書き込まれたオブジェクトデータの値を置き換えます
$mc->replace($key, array('some'=>'haha', 'array'=>'xxx'));
$val = $mc->get($key);
echo “n”.str_pad(‘$mc->replace() ’, 60, ‘_’).“n”;
var_dump($val);
// memcached 内のオブジェクトを削除します
$mc->delete($key);
$val = $mc->get($key);
echo “n”.str_pad(‘$mc->delete() ’, 60, ‘_’).“n”;
var_dump($val);
?>
Memcache メソッドのリスト:
Memcache::add — サーバーに項目を追加します
Memcache::addServer — memcached サーバーを接続プールに追加します
Memcache::close — memcached サーバー接続を閉じる
Memcache::connect — memcached サーバー接続を開きます
memcache_debug — デバッグ出力をオン/オフにする
Memcache::decrement — 項目の値をデクリメントします
Memcache::delete — サーバーからアイテムを削除します
Memcache::flush — サーバーにある既存のアイテムをすべてフラッシュします
Memcache::get — サーバーからアイテムを取得する
Memcache::getExtendedStats — プール内のすべてのサーバーから統計を取得します
Memcache::getServerStatus — サーバーのステータスを返す
Memcache::getStats — サーバーの統計を取得する
Memcache::getVersion — サーバーのバージョンを返す
Memcache::increment — 項目の値をインクリメントします
Memcache::pconnect — memcached サーバーの永続接続を開く
Memcache::replace — 既存の項目の値を置換します
Memcache::set — データをサーバーに保存する
Memcache::setCompressThreshold — 大きな値の自動圧縮を有効にする
Memcache::setServerParams — 実行時にサーバーのパラメーターとステータスを変更します