この記事では、主に 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 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['view'])){ $_SESSION['view'] = $_SESSION['view'] + 1; }else{ $_SESSION['view'] = 1; } echo "【view】{$_SESSION['view']}"; //这里设置session.save_handler方式为redis,session.save_path为redis的地址和端口,设置之后刷新,再回头查看redis,会发现redis中的生成了sessionId,sessionId和浏览器请求的是一样的, //也可以使用 Session_set_save_handler(‘open','close',' read',' write',' destory',' gc'); //用法如下自定义一个Redis_session类 <?php class RedisSession{ private $_redis = array( 'handler' => null, //数据库连接句柄 'host' => null, //redis端口号 'port' => null, ); public function __construct($array = array()){ isset($array['host'])?$array['host']:"false"; isset($array['port'])?$array['host']:"false"; $this->_redis = array_merge($this->_redis, $array); } public function begin(){ //设置session处理函数 session_set_save_handler( array($this, 'open'), array($this, 'close'), array($this, 'read'), array($this, 'write'), array($this, 'destory'), array($this, 'gc') ); } public function open(){ $redis = new Redis(); $redis->connect($this->_redis['host'], $this->_redis['port']); if(!$redis){ return false; } $this->_redis['handler'] = $redis; $this->gc(null); return true; } //关 public function close(){ return $this->_redis['handler']->close(); } //读 public function read($session_id){ return $this->_redis['handler']->get($session_id); } //写 public function write($sessionId, $sessionData){ return $this->_redis['handler']->set($sessionId, $sessionData); } public function destory($sessionId){ return $this->_redis['handler']->delete($sessionId) >= 1 ? true : false; } public function gc(){ //获取所有sessionid,让过期的释放掉 $this->_redis['handler']->keys("*"); return true; } } $ses = new RedisSession(array('host'=>'127.0.0.1','port'=>'6379')); $ses->begin(); session_start(); $_SESSION['name']='zhangsan'; echo $_SESSION['name'];
php htmlentities() 関数の定義と使用法について
PHP7 での openssl の使用について。 1 mcrypt の置き換えの概要
以上がRedisをセッションに追加する実装についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。