>  기사  >  백엔드 개발  >  PHP는 파일 대신 Redis를 사용하여 세션을 저장합니다.

PHP는 파일 대신 Redis를 사용하여 세션을 저장합니다.

墨辰丷
墨辰丷원래의
2018-05-25 14:35:181823검색

이 글에서는 주로 PHP가 파일 대신 Redis를 사용하여 Sessions를 저장하는 방법을 소개하고 있으며, Redis를 사용하여 Sessions를 저장하는 관련 기술을 자세히 분석하여 필요한 친구들이 참고할 수 있습니다

이 문서에서는 PHP가 파일 대신 Redis를 사용하여 세션을 저장하는 예제를 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

PHP는 기본적으로 파일을 사용하여 세션을 저장합니다. 동시성이 크면 효율성이 매우 낮습니다. 그리고 Redis는 높은 동시성을 매우 잘 지원하므로 파일 저장 세션 대신 Redis를 사용할 수 있습니다.

여기서는 PHP의 session_set_save_handler 함수의 기능과 사용법을 소개합니다. 이 함수는 사용자 수준의 세션 저장 기능(예: 열기, 닫기, 쓰기 등)을 정의합니다. session_set_save_handler 函数的作用和使用方法。该函数定义用户级session保存函数(如打开、关闭、写入等)。

原型如下:

bool session_set_save_hanler(callback open,callback close,callback read,callback write,callback destory,callback gc)

프로토타입은 다음과 같습니다.

bool session_set_save_hanler(callback open,callback close,callback read,callback write,callback destory,callback gc)

session_set_save_handler 함수의 매개변수는 다음과 같습니다.

🎜🎜🎜
Parameter Description
open 이 함수는 세션이 열릴 때 호출됩니다. 두 개의 매개변수를 받습니다. 첫 번째 매개변수는 세션을 유지하는 경로이고, 두 번째 매개변수는 세션 작업이 완료되면 호출되는 함수입니다. 매개변수를 받지 않습니다.
read 은 세션 ID를 매개변수로 사용합니다. 세션 ID를 통해 데이터 저장자로부터 데이터를 얻어서 이 데이터를 반환합니다. 데이터가 비어 있으면 빈 문자열이 반환될 수 있습니다. 이 함수는
<span style="font-family:新宋体">session_start</span>write을 호출하기 전에 실행되며 데이터가 저장될 때 호출됩니다.두 개의 매개변수가 있는데, 하나는 세션 ID이고 다른 하나는 세션 데이터입니다.
destroy destroy 함수는 <span style="font-family:新宋体">session_destroy</span> 함수가 호출될 때 트리거됩니다. 매개변수 세션 ID는 하나만 있습니다
gc PHP가 세션 가비지 수집 메커니즘을 실행할 때 트리거됩니다


이 함수를 사용하기 전에 먼저 php.ini 구성의 session.save_handler 옵션을 설정하세요. 그렇지 않으면 session_set_save_handle이 적용되지 않습니다.

세션 관리 클래스인 sessionManager.php를 작성합니다. 코드는 다음과 같습니다.

<?php
class SessionManager{
 private $redis;
 private $sessionSavePath;
 private $sessionName;
 private $sessionExpireTime=30;//redis,session的过期时间为30s
 public function __construct(){
 $this->redis = new Redis();//创建phpredis实例
 $this->redis->connect(&#39;127.0.0.1&#39;,6379);//连接redis
 $this->redis->auth("107lab");//授权
 $retval = session_set_save_handler(
  array($this,"open"),
  array($this,"close"),
  array($this,"read"),
  array($this,"write"),
  array($this,"destroy"),
  array($this,"gc")
 );
 session_start();
 }
 public function open($path,$name){
 return true;
 }
 public function close(){
 return true;
 }
 public function read($id){
 $value = $this->redis->get($id);//获取redis中的指定记录
 if($value){
  return $value;
 }else{
  return &#39;&#39;;
 }
 }
 public function write($id,$data){
 if($this->redis->set($id,$data)){//以session ID为键,存储
  $this->redis->expire($id,$this->sessionExpireTime);//设置redis中数据的过期时间,即session的过期时间
  return true;
 }
 return false;
 }
 public function destroy($id){
 if($this->redis->delete($id)){//删除redis中的指定记录
  return true;
 }
 return false;
 }
 public function gc($maxlifetime){
 return true;
 }
 public function __destruct(){
 session_write_close();
 }
}

SessionManager 생성자는 주로 Redis 서버에 연결하는 데 사용되며, session_set_save_handler 함수를 사용하여 세션 콜백 함수를 설정하고, 세션 기능을 활성화하려면 session_start 함수를 호출하세요. 이 예제의 open, close 및 gc 콜백 함수는 그다지 유용하지 않기 때문에 true를 직접 반환합니다.

쓰기 콜백 함수에서 세션 ID를 키로 사용하고, 세션 데이터를 Redis 서버에 값으로 저장하고, 세션 만료 시간을 30초로 설정합니다. 읽기 콜백 함수에서 세션 ID를 키로 사용하여 Redis 서버에서 데이터를 읽고 이 데이터를 반환합니다. destroy 콜백 함수에서는 세션 ID가 Redis 서버에서 해당 세션 데이터를 삭제하기 위한 키로 사용됩니다.

사용하려면 SessionManager 클래스를 포함하고 SessionManager 개체를 인스턴스화하면 됩니다. 아래에서 session_set.php 파일을 생성하세요.

<?php
 include(&#39;SessionManager.php&#39;);
 new SessionManager();
 $_SESSION[&#39;username&#39;] = &#39;captain&#39;;

코드를 입력하세요. 그런 다음 session_get.php 파일을 만들고 다음 코드를 입력하세요.

<?php
 include(&#39;SessionManager.php&#39;);
 new SessionManager();
 echo $_SESSION[&#39;username&#39;];

테스트할 때 먼저 session_set.php에 액세스한 다음 session_get.php에 액세스하세요.

아래와 같이 redis 데이터베이스를 다시 확인하세요

127.0.0.1:6379> keys *
1) "oe94eic337slnjv1bvlreoa574"
127.0.0.1:6379> get oe94eic337slnjv1bvlreoa574
"username|s:7:\"captain\";"

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되길 바랍니다.


관련 권장 사항:

PHP를 사용하여 redis에 존재하지 않는 6자리 난수를 얻는 방법

PHP를 사용하여 redis메시지 대기열을 구현하여 Weibo

를 게시하는 방법

CI 프레임워크(CodeIgniter) 운영redis단계 분석

위 내용은 PHP는 파일 대신 Redis를 사용하여 세션을 저장합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.