Web Programming/PHP2006. 8. 9. 20:03

이전의 방법은 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>");

?>



Posted by BAGE