php 다 중 사이트 공용 session 구현 단일 로그 인 방법 상세 설명

이 사례 는 phop 이 다 중 사이트 공용 session 을 실현 하여 단일 로그 인 을 실현 하 는 방법 을 설명 한다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
요즘 은 한가 해서 하 도 급 한 로그 인 문 제 를 정리 하고 있 습 니 다.
단일 로그 인의 기본 원 리 는 클 라 이언 트 가 sesionid 를 공유 하고 서버 에서 session 정 보 를 공유 하 는 것 이다.공 통 된 sessionid 를 통 해 서버 에서 같은 session 정 보 를 얻 으 면 단일 로그 인(즉,다 중 사이트 에서 사용자 정 보 를 공유 하고 한 곳 은 로그 인 하 며 곳곳에서 사용 가능)의 목적 을 달성 할 수 있 습 니 다.
단일 로그 인 은 두 가지 상황 으로 나 뉜 다.
1.사이트 가 같은 서버 에 배치 되 고 같은 2 급 도 메 인 이름 을 사용 합 니 다.
이런 상황 에 서 는 비교적 해결 하기 쉽다.
1.먼저 사이트 가 클 라 이언 트 sessionid(쿠키 존재)의 공유 문 제 를 해결 합 니 다.사용 iniset()함 수 는 쿠키 의 도 메 인 을 지정 할 수 있 습 니 다.다음 과 같 습 니 다ini_set('session.cookie_domain', '.xxxx.com');//서버 쿠키 의 도 메 인 을 설정 하고 xxxx 는 공용 2 급 도 메 인 이름 입 니 다.
2.그 다음 에 사이트 가 서버 에 있 는 session 정보의 공 유 를 해결 합 니 다.사이트 가 같은 서버 에 있 기 때문에 생 성 된 session 파일 은 공용 으로 사용 할 수 있 으 며 sessionid 를 사용 하여 해당 하 는 session 정 보 를 직접 얻 을 수 있 습 니 다.
2.사이트 가 서로 다른 서버 에 배치 되 어 서로 다른 도 메 인 이름 을 사용 합 니 다.
이러한 상황 은 비교적 복잡 합 니 다.사이트 가 서로 다른 서버 에서 서로 다른 도 메 인 이름 을 사용 하기 때문에 클 라 이언 트 에서 ini 를 사용 할 수 없습니다.set 쿠키 의 역할 도 메 인 을 설정 하고 서버 에서 도 각각 자신의 session 파일 을 생 성하 여 공유 할 수 없 지만 해결 방법 을 사용 합 니 다.
1.클 라 이언 트 sessionid 동기 화 문 제 를 먼저 해결 합 니 다.
우리 에 게 세 개의 사이트 가 있다 고 가정 하면 도 메 인 이름 은 각각 aa.com,bb.com,cc.com 이다.저 희 는 aa.com 에 공용 로그 인 입구 login.php 를 만 들 었 습 니 다.세 사이트 의 로그 인 요청 은 모두 이 페이지 로 넘 어 갑 니 다.코드 프로 세 스 는 다음 과 같 습 니 다.

$back = login($name,$pwd);//      ,     session
//      ,        
if($back){
  $sessionid = session_id();
  $key = encode($session,$keyword);//     
  //           ,           
}

로그 인 성공 html 알림 페이지 에 다음 코드 를 추가 합 니 다.iframe 탭 을 이용 하여 동기 화 로그 인 을 요청 하 는 사이트 입 니 다.

aa.com 과 cc.com 사이트 의 setcookie.php 파일 은 다음 과 같 습 니 다.

//  $key
decode($key);
//      sessionid      sessionid
session_id($_GET['sessionid']);
session_start();

2.세 사이트 서버 에서 session 을 공유 하 는 문 제 를 해결 합 니 다.
앞에서 말 했 듯 이 세 사이트 가 같은 서버 에 없 기 때문에 각자 의 session 파일 을 생 성 합 니 다.이 파일 을 공유 하려 면 도 메 인 을 뛰 어 넘 는 등 일련의 문제 에 직면 합 니 다.그래서 저 희 는 파일 로 session 정 보 를 저장 하지 않 고 session 정 보 를 데이터베이스 에 저장 합 니 다.이렇게 하면 session 정보의 sessionid 를 얻 으 면 모든 사이트 에서 같은 session 정 보 를 방문 할 수 있 습 니 다.
우리 mysql 만 들 기session.php 파일 은 session 정 보 를 데이터베이스 에 저장 하 는 데 사 용 됩 니 다.코드 는 다음 과 같 습 니 다.

$gb_DBname="test";            //     
$gb_DBuser="root";            //       
$gb_DBpass="";              //     
$gb_DBHOSTname="127.0.0.1";        //       IP  
$SESS_DBH="";              //     
session_module_name("User");      //  session          
$SESS_LIFE=get_cfg_var("session.gc_maxlifetime");//  session      ,      
function sess_open($save_path,$session_name)
{
  global $gb_DBHOSTname,$gb_DBname,$gb_DBuser,$gb_DBpass,$SESS_DBH;
  if(!$SESS_DBH=mysql_pconnect($gb_DBHOSTname,$gb_DBuser,$gb_DBpass)){
  echo "MySql Error:".mysql_error()."";
  die();
  }
  if(!mysql_select_db($gb_DBname,$SESS_DBH)){
  echo "MySql Error:".mysql_error()."";
  die();
  }
  return true;
}
function sess_close(){
return true;
}
function sess_read($key)
{
  global $SESS_DBH,$SESS_LIFE;
  $qry="select value from db_session where sesskey = '$key' and expiry > ".time();
  $qid=mysql_query($qry,$SESS_DBH);
  if(list($value)=mysql_fetch_row($qid)){
  return $value;
  }
  return false;
}
//  session  。  session        :db_session
//      id,       
//sesskey  sessionid
//values  session 
//expiry  session     
function sess_write($key,$val)
{
  global $SESS_DBH,$SESS_LIFE;
  $expiry=time()+$SESS_LIFE;
  $value=$val;
  $qry="insert into db_session values('$key',$expiry,'$value')";
  $qid=mysql_query($qry,$SESS_DBH);
  if(!$qid){
  $qry="update db_session set expiry=$expiry, value='$value' where sesskey='$key' and expiry >".time();
  $qid=mysql_query($qry,$SESS_DBH);
  }
  return $qid;
}
function sess_destroy($key)
{
  global $SESS_DBH;
  $qry="delete from db_session where sesskey = '$key'";
  $qid=mysql_query($qry,$SESS_DBH);
  return $qid;
}
function sess_gc($maxlifetime)
{
  global $SESS_DBH;
  $qry="delete from db_session where expiry < ".time();
  $qid=mysql_query($qry,$SESS_DBH);
  return mysql_affected_rows($SESS_DBH);
}
session_set_save_handler("sess_open","sess_close","sess_read","sess_write","sess_destroy","sess_gc");

이후 session 을 사용 해 야 하 는 페이지 에서 sessionstart()전에 이 파일 을 도입 하면 다른 것 은 평소 seesion 을 사용 하 는 것 과 같 으 면 됩 니 다.할당 한 session 이 데이터베이스 에 저장 되 어 있 음 을 발견 할 수 있 습 니 다.
더 많은 PHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기