다른 도메인 세션 저장 (db)

리눅스/PHP|2015. 1. 16. 10:30
반응형

이전의 방법은 php.ini 를 일일이 수정해 줘야 하기땜에 손이 많이 갑니다


나아진점은 
1. 세션값을 디폴트는 /tmp 밑에 저장하는데 이걸 mysql 을 이용합니다... 
   이렇게 하면 속도도 빨라지고 혹시 서버가 별개이어도 mysql 만 접근이 가능하면 문제

가 되지 않습니다. 
2. php.ini 는 전혀 수정하실 필요 없습니다. (소스상에서 설정 다 바꾸어 줍니다)

머 이정도네요....


설명 들어갑니다...

1. 먼저 아래처럼 session.inc 라는 파일이 있습니다..


[session.inc]

<? 
/* ------------------------------------------------------------------------ 
* Create a new database in MySQL called "sessions" like so: 

* CREATE TABLE sessions ( 
*      sesskey char(32) not null, 
*      expiry int(11) unsigned not null, 
*      value text not null, 
*      PRIMARY KEY (sesskey) 
* ); 
*/

$SESS_DBH = ""; 
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");

function sess_open($save_path, $session_name) 

global $SESS_DBH;

$SESS_DBH = mysql_pconnect("localhost", "heal", "moga33") or die("Can't connect to

SQL Server"); 
mysql_select_db("heal", $SESS_DBH) or die("Can't connect to SQL Server");

return true; 
}

function sess_close() 

return true; 
}

function sess_read($key) 

global $SESS_DBH, $SESS_LIFE;

$qry = "SELECT value FROM sessions WHERE sesskey = '$key' AND expiry > " . time(); 
$qid = mysql_query($qry, $SESS_DBH);

if (list($value) = mysql_fetch_row($qid)) { 
return $value; 
}

return false; 
}

function sess_write($key, $val) 

global $SESS_DBH, $SESS_LIFE;

$expiry = time() + $SESS_LIFE; 
$value = addslashes($val);

$qry = "INSERT INTO sessions (sesskey,expiry,value) VALUES ('$key', $expiry,

'$value')"; 
$qid = mysql_query($qry, $SESS_DBH);

if (! $qid) { 
$qry = "UPDATE sessions 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 sessions WHERE sesskey = '$key'"; 
$qid = mysql_query($qry, $SESS_DBH);

return $qid; 
}

function sess_gc($maxlifetime) 

global $SESS_DBH;

$qry = "DELETE FROM sessions 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_set_cookie_params(0, "/", ".url.com");

session_start();

?>



이 파일이 젤 중요한데요... 
요걸 세션을 쓰는곳마다 (그니까 session_start() 가 쓰이는 곳) 마다 첨부시켜주세요.... 
젤 위부분에 보면 테이블이 있습니다. 이거 mysql 에 만들어 주세요. 세션이 저장될 테이

블입니다. 
글구 젤 밑에서 두번째 줄에 보면 
session_set_cookie_params(0, "/", ".url.com"); 
이게 있는데여 요걸 그쪽 도메인에 맞게 수정해 주세요...



2. 그리구 테스트 해보는 파일....

[session.php]

<?

include "session.inc";

if ($mode == 'login') 
{

if ( $logid=='toughing' && $passwd=='aaaa' ) 

echo(" 
Login OK....<br> 
");

$_logid = $logid; 
$_passwd = $passwd; 
session_register("_logid"); 
session_register("_passwd");

echo(" <meta http-equiv='Refresh' content='1; URL=session1.php'> "); 

else 

echo("Login Failure....<br>");

echo(" <meta http-equiv='Refresh' content='3; URL=$PHP_SELF'> "); 
}

exit; 

else if ($mode == 'logout') 

session_unregister("_logid"); 
session_unregister("_passwd");

echo(" <meta http-equiv='Refresh' content='0; URL=$PHP_SELF'> "); 
}

//sess_gc(1); 
echo(" 
  <form name='log' action='$PHP_SELF' method='post'> 
<input type=hidden name=mode value=login> 
아이디 <input type=text size=10 name='logid' style='border : 1 solid #666666;

font-family : 돋움'><br> 
암호 <input type=password size=10 name='passwd' style='border : 1 solid #666666;

font-family : 돋움'><br> 
<input type=submit value='확인'> 
  </form> 
");

?>



[session1.php]

<? 
include "session.inc";

if ($_logid && $_passwd) 

echo(" 
이 페이지는 로그인을 한 사람만 볼 수 있당..<br> 
<a href='test.php'>갈은 도메인</a> 
<a href='http://www.hul.com/test.php?$SID'>다른 도메인</a> 
<form name='log' action='session.php' method='post'> 
<input type=hidden name=mode value=logout> 
<input type=submit value='로그아웃'> 
</form> 
"); 
$ss = session_get_cookie_params(); 
echo("^$ss[lifetime]^$ss[path]^$ss[domain]^"); 
exit; 
}


echo("아무나 다 보는 페이지..<br>");

?> 


[출처] 바게의 열린공간 | BAGE (http://blog.bagesoft.com/197)

반응형

댓글()