ホームページ  >  記事  >  バックエンド開発  >  phpのセッションをredisやmemcacheに保存する方法を詳しく解説

phpのセッションをredisやmemcacheに保存する方法を詳しく解説

黄舟
黄舟オリジナル
2017-08-13 09:14:221246ブラウズ

セッションのご紹介

セッションとは、中国語で会話と訳されることが多く、本来の意味は始まりと終わりのある一連の動作・メッセージを指します。例えば電話をかける場合、ピッキングからの一連のプロセスを指します。電話機をダイヤルして電話を切ると、セッションを呼び出すことができます。 「ブラウザセッション中、…」といった言葉を目にすることがありますが、ここでいうセッションとは本来の意味で使われており、ブラウザウィンドウが開いてから閉じるまでの期間を指します①。最も紛らわしいのは、「セッション中のユーザー(クライアント)」という文ですが、これはユーザーの一連のアクション(通常、ログインから商品の購入など、特定の目的に関連する一連のアクション)を指します。チェックアウトからログアウトまでのオンライン ショッピングのプロセスをトランザクションと呼ぶこともあります)。ただし、単に接続を指すこともあれば、②の意味のみを指すこともあります。

ただし、セッションという言葉がネットワーク プロトコルに関連付けられている場合、多くの場合、「接続指向」および/または「状態の維持」という 2 つの意味が含まれます。「接続指向」とは、通信する前に双方が通信する必要があることを指します。 . まず電話をかけるなどのコミュニケーションチャネルを確立し、相手が電話に出るまでコミュニケーションは始まりません。手紙とは異なり、手紙を送るときには相手の住所が正しいかどうかを確認することができません。通信チャネルは必ずしも確立できるとは限りませんが、送信者にとっては通信はすでに開始されています。 「ステータスの維持」とは、通信相手が一連のメッセージを相互に依存できるように関連付けることができることを意味します。たとえば、ウェイターは、再び来た古い顧客を認識し、その顧客が前回店に 1 ドルを借りていたことを思い出すことができます。 。このカテゴリの例には、「TCP セッション」または「POP3 セッション」が含まれます③。

そして、Web サーバーの開発が活発に行われる時代において、Web 開発におけるセッションのセマンティクスは、クライアントとサーバーの間で状態を維持するために使用されるソリューションの一種を指します。④場合によっては、セッションは、「xxx をセッションに保存する」など、このソリューションのストレージ構造を指すために使用されることもあります⑤。 Web 開発に使用されるさまざまな言語がこのソリューションをある程度サポートしているため、セッションは、多くの場合 javax.servlet.http.HttpSession など、特定の言語のコンテキストでその言語のソリューションを参照するためにも使用されます。 Javaで提供されるセッション⑥をセッションと呼びます。

この混乱は元に戻せないため、この記事でのセッションという言葉の使用も文脈に応じて異なる意味を持ちますので、区別するように注意してください。
この記事では、中国語の「ブラウザセッション期間」は①の意味を表現するために使用され、「セッションメカニズム」は④の意味を表現するために使用され、「セッション」は⑤の意味を表現するために使用され、具体的な「HttpSession」は⑥

なぜSESSIONをキャッシュに保存する必要があるのか​​

PHPに関する限り、言語自体がサポートするセッションはファイルの形式でディスクファイルに保存され、保存パスは、設定ファイルまたはプログラム内で設定することができますが、これをファイルに保存することには欠点があります。セッションが使用されている限り、指定されたセッション ID が複数のファイルから検索されるため、非常に非効率的です。

2つ目は、複数のサーバーを使用する場合、セッション損失の問題が発生する可能性があることです(実際には他のサーバーに保存されます)。

もちろん、キャッシュに保存することで上記の問題を解決できます。PHP 独自のセッション関数を使用する場合は、session_set_save_handler() 関数を使用してセッション処理プロセスを簡単に再制御できます。 PHP のセッション シリーズ関数を使用しない場合は、同様のセッション関数を自分で作成することもできます。これは私が現在取り組んでいるプロジェクトです。これは、ユーザーの Mid とセッション ID に基づいてハッシュを計算します。ログイン時に要求されるたびに、有効であるように sessionId を追加する必要があります (初回ログイン時には必要ありません。この時点で sessionId が作成され、クライアントに返されます)。これも非常に便利です。 、簡潔かつ効率的。もちろん、この記事で主に話しているのは、PHP 自身の SESSION での「操作」です。

SESSION はキャッシュに保存されます

php はキャッシュを Redis に保存します。もちろん、ini_set() 関数を使用してセッションの処理と保存を変更することもできます。もちろん、本番環境ではこの方法を使用することをお勧めします。

単純にセッションをredisに操作したい場合は、次のコードを実行します

<?php
ini_set("session.save_handler", "redis");
ini_set("session.save_path", "tcp://localhost:6379");
session_start();
header("Content-type:text/html;charset=utf-8");
$_SESSION[&#39;view&#39;] = &#39;zhangsan&#39;;
echo $_SESSION[&#39;view&#39;];

ここで、session.save_handlerメソッドをredisに設定し、session.save_pathをredisのアドレスとポートに設定し、設定後にリフレッシュします。 redis に目を向けると、redis が生成されます。sessionId はブラウザのリクエストと同じです

memcache

<?php
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://localhost:11211");
session_start();
header("Content-type:text/html;charset=utf-8");
$_SESSION[&#39;view&#39;] = &#39;zhangsan&#39;;
echo $_SESSION[&#39;view&#39;];

であれば、

Session_set_save_handler(‘open’,’close’,’ read’,’ write’,’ destory’,’ gc’);

を使用することもできます。使用方法は次のとおりです。 Redis_session クラスをカスタマイズするには

<?php
class RedisSession{
    private $_redis = array(
        &#39;handler&#39; => null, //数据库连接句柄
        &#39;host&#39; => null,   //redis端口号
        &#39;port&#39; => null,
    );
    public function __construct($array = array()){
        isset($array[&#39;host&#39;])?$array[&#39;host&#39;]:"false";
        isset($array[&#39;port&#39;])?$array[&#39;host&#39;]:"false";
        $this->_redis = array_merge($this->_redis, $array);
    }
    public function begin(){
        //设置session处理函数
        session_set_save_handler(
            array($this, &#39;open&#39;),
            array($this, &#39;close&#39;),
            array($this, &#39;read&#39;),
            array($this, &#39;write&#39;),
            array($this, &#39;destory&#39;),
            array($this, &#39;gc&#39;)
        );
    }
    public function open(){
        $redis = new Redis();
        $redis->connect($this->_redis[&#39;host&#39;], $this->_redis[&#39;port&#39;]);
        if(!$redis){
            return false;
        }
 
        $this->_redis[&#39;handler&#39;] = $redis;
        $this->gc(null);
        return true;
    }
    //关
    public function close(){
        return $this->_redis[&#39;handler&#39;]->close();
    }
    //读
    public function read($session_id){
        return $this->_redis[&#39;handler&#39;]->get($session_id);
    }
    //写
    public function write($sessionId, $sessionData){
        return $this->_redis[&#39;handler&#39;]->set($sessionId, $sessionData);
    }
    public function destory($sessionId){
        return $this->_redis[&#39;handler&#39;]->delete($sessionId) >= 1 ? true : false;
    }
    public function gc(){
        //获取所有sessionid,让过期的释放掉
        $this->_redis[&#39;handler&#39;]->keys("*");
        return true;
    }
}
$ses = new RedisSession(array(&#39;host&#39;=>&#39;127.0.0.1&#39;,&#39;port&#39;=>&#39;6379&#39;));
$ses->begin();
session_start();
$_SESSION[&#39;name&#39;]=&#39;zhangsan&#39;;
echo $_SESSION[&#39;name&#39;];

この方法で、Redis コードの実行などのセッション データを実装できます。プロセス中に Redis をインストールする必要があります

以上がphpのセッションをredisやmemcacheに保存する方法を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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