ホームページ  >  記事  >  バックエンド開発  >  Redisをセッションに追加する実装について

Redisをセッションに追加する実装について

不言
不言オリジナル
2018-07-03 15:39:381434ブラウズ

この記事では、主に redis にセッションを追加する例を紹介し、セッションの詳細を紹介し、コード例を提供します。必要な友人は、次の

セッション情報を redis に追加する

を参照してください。 セッションの紹介

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

この記事では、中国語の「ブラウザセッション期間」は①の意味を表現するために使用され、「セッションメカニズム」は④の意味を表現するために使用され、「セッション」は意味を表現するために使用されます⑥の意味を表現するために、特定の「HttpSession」が使用されます

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

ここまでphp が関係しているように、言語自体でサポートされているセッションはファイルの形式になっていますディスク ファイルに保存し、指定したフォルダーに保存します。保存されたパスは設定ファイルで設定するか、関数 session_save_path() を使用して設定できます。ただし、これには欠点があります。
1 つ目は、ファイルに保存することです。システム上、効率が悪くなります。セッションが使用されている限り、指定されたセッション 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"); 
 
if(isset($_SESSION[&#39;view&#39;])){ 
 
  $_SESSION[&#39;view&#39;] = $_SESSION[&#39;view&#39;] + 1; 
 
}else{ 
 
  $_SESSION[&#39;view&#39;] = 1; 
 
} 
 
echo "【view】{$_SESSION[&#39;view&#39;]}"; 
 
//这里设置session.save_handler方式为redis,session.save_path为redis的地址和端口,设置之后刷新,再回头查看redis,会发现redis中的生成了sessionId,sessionId和浏览器请求的是一样的, 
 
  
 
//也可以使用 
 
Session_set_save_handler(‘open&#39;,&#39;close&#39;,&#39; read&#39;,&#39; write&#39;,&#39; destory&#39;,&#39; gc&#39;); 
 
//用法如下自定义一个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 中国語 Web サイトをご覧ください。

関連する推奨事項:

php htmlentities() 関数の定義と使用法について

PHP7 での openssl の使用について。 1 mcrypt の置き換えの概要

以上がRedisをセッションに追加する実装についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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