세션핸들러 개요
세션핸들러에는 PHP에서 기본으로 제공하는 내장핸들러에서 제공하지 못하는 다양한 저장매체를 활용하기 위해 제공됩니다. 또한 타방문자의 정보를 얻을 수 있는 세션핸들러 함수가 추가로 제공됩니다. 내장핸들러에는 이러한 세션핸들러 함수가 포함되어 있지 않습니다. 따라서 파일시스템을 이용하더라도 세션핸들러 함수를 사용하기 위해서는 별도로 제공되는 파일시스템용 세션핸들러를 추가로 포함하여야 합니다.
세션핸들러 구성
세션함수에는 기본적으로 파일시스템용 핸들러가 내장되어 있습니다. 세션핸들러에는 내장핸들러에서 제공하지 못하는 다양한 저장매체를 활용하기 위해 제공됩니다. 또한 타방문자의 정보를 얻을 수 있는 세션핸들러 함수가 추가로 제공됩니다. 내장핸들러에는 이러한 세션핸들러 함수가 포함되어 있지 않습니다. 따라서 파일시스템을 이용하더라도 세션핸들러 함수를 사용하기 위해서는 별도로 제공되는 파일시스템용 세션핸들러를 추가로 포함하여야 합니다.
< 세셔너 & 세션핸들러 구성 >
저장 매체의 분류
세션핸들러에는 파일시스템용, 데이터베이스용, DBM/DBA용, 쿠키용 외장모듈이 포함되어 있습니다. 외장모듈을 사용하면 내장모듈에는 없는 여러가지 세션핸들러 함수와 이벤트 핸들러가 추가되어 있습니다. 이러한 기능은 PHP3 세셔너와 PHP4 세션에서 동일하게 사용됩니다.
구분 내장모듈 외장모듈
파일 데이터베이스 DBM/DBA 쿠키
저장매체 파일
시스템
파일
시스템
미니디비에서 지원하는
모든 데이터베이스
(미니디비 0.2.1)
  • MSQL
  • MSSQL
  • MySQL
  • Oracle(OCI), Oracle(ORA)
  • PostgreSQL
  • SyBASE
file-based
데이터베이스
클라이언트
쿠키파일
각 저장매체의 기능
파일시스템용 외장모듈
파일시스템용 세션핸들러는 세셔너에 내장된 기능을 좀 더 확장시키기 위한 것으로 PHP4 세션함수와의 호환성을 위해 확장된 기능을 세셔너에 포함시키지 않았습니다. 따라서 확장된 파일시스템용 세션핸들러는 세션너뿐만 아니라 PHP4 세션함수에서도 그대로 사용하여 기능을 확장할 수 있습니다.
데이터베이스용 외장모듈
데이터베이스용 세션핸들러는 여러가지 데이터베이스를 다루기 위해 내부적으로 미니디비(공개된 DB Layer)를 사용하기 때문에 미니디비에서 지원되는 데이터베이스를 세션핸들러에서도 그대로 사용할 수 있습니다. 미니디비에 대해서는 미니디비 메뉴를 참조하세요. 현재(2001.2.2)까지 미니디비에서 지원되는 데이터베이스로는 MySQL, 오라클, 포스트그레스, 사이베이스, MSQL, MSSQL이 있습니다.
DBM/DBA용 외장모듈
DBM(DataBase Manager)용 세션핸들러는 Ying Zhang라는 분이 제작하여 공개한 session_dbm을 참고하여 PHP3에서 사용할 수 있도록 만들었습니다. DBA(DataBase Abstraction layer)용은 DBM용보다 개선된 형태의 file-based 데이터베이스를 위한 것으로 PHP4에서 사용할 수 있도록 만들었습니다.
DBM은 PHP3를 설치할 때 특별히 지시하지 않아도 사용할 수 있는 것으로 보이나, DBA는 PHP4를 설치할 때 옵션을 지정하여야 사용할 수 있습니다. 즉, DBA 함수는 별도의 외장모듈(디비 핸들러)이 필요하며 소스 컴파일할 때 이 모듈을 지정하여야 합니다. 참고적으로 PHP3에서는 DBA를 지원하지 않는 것 같습니다. PHP3에서 DBA를 사용하기 위해 시도하시는 분이 있는 것 같은데 그 분이 성공하였는 지는 모르겠습니다. 저는 DBA 외장모듈로 gdbm(GNU database manager)을 선택하였으며 이 핸들러는 기존의 DBM과 호환성을 유지하고 있는 것으로 압니다. 세셔너에서는 일시적으로 사용되는 세션데이터를 다루기 때문에 이러한 호환성이 그리 중요하지는 않은 것 같습니다. gdbm 대신에 db2 핸들러를 가지고 계신 분은 db2 핸들러를 사용하셔도 됩니다. 저와 같이 gdbm 핸들러를 사용하기 위해서는 소스 컴파일 환경설정할 때 --with-gdbm 옵션을 선택하여야 합니다.
[root@linux hwooky]# ./configure --with-gdbm ...(다른 옵션도 줄줄이)...
위와 같이 하였는데도 DBA function을 사용할 수 없다면(보통 dba_open() 함수를 사용할 수 없다는 에러 발생) 제대로 설치되지 않은 것으로 보이며, 아마 소스컴파일할 때 gdbm 라이브러리 libgdbm.so와 헤더파일 gdbm.h을 찾을 수 없어서 그럴 지도 모르겠네요. /usr/lib 또는 /usr/local/lib에 라이브러리 libgdbm.so가 있는지 그리고 /usr/include 또는 /usr/local/include에 헤더파일 gdbm.h가 있는지 확인해 보세요. 어디에도 없다면 GNU 라이브러리 ftp 사이트(ftp://ftp.gnu.org/pub/gnu/gdbm/)에 가셔서 gdbm을 찾아 오세요. 저 같은 경우에는 /usr/lib와 /usr/include에서 해당 파일을 찾을 수 있었습니다. 그래서 환경설정시 아래와 같이 디렉토리를 지정하여 소스 컴파일 하였습니다.
[root@linux hwooky]# ./configure --with-gdbm=/usr/lib ...(다른 옵션도 줄줄이)...
핸들러를 제대로 설치하였는데도 dba_open() 함수에서 에러가 발생한다면 dba_open() 함수의 세번째 인자로 지정된 핸들러명이 제대로 되어 있는지 확인해 보십시오. db2 핸들러가 동작 중이라면 핸들러명을 "db2"로, gdbm 핸들러가 동작 중이라면 핸들러명을 "gdbm"으로 지정하여야 합니다.
[code php;gutter:false] $HandlerID = dba_open("/tmp", "c", "db2");
// 또는
$HandlerID = dba_open("/tmp", "c", "gdbm"); [/code]
PHP4에서도 그대로 DBM을 이용하는 것이 세션핸들러를 개발하는 수고를 덜 수 있으리라 생각되지만, DBM은 지나간 기술에 의해 개발된 것으로 PHP4에서는 가능하면 개선된 기능을 수행하는 DBA를 이용하는 것이 좋으리라 판단되어 소스 관리하기가 불편하지만 PHP3와 PHP4를 분리하여 세션핸들러를 작성하였습니다. 여러분이 db2 또는 gdbm 핸들러 대신에 dbm 핸들러를 사용하시면 DBM용 세션핸들러를 PHP4에서도 그대로 이용할 수 있으리라 생각됩니다(실험해 보지는 않았음).
쿠키용 외장모듈
"쿠키용 세션함수"라고 하면 아마 많은 분의 머리가 상당히 혼란해질 수도 있다고 생각되네요. "쿠키면 쿠키고 세션함수면 세션함수이지 쿠키용 세션함수가 뭐야?"라고 말이죠. 그러나 단순하게 생각하세요. 세션데이터를 저장하는 저장매체로 서버 자원이 아닌 클라이언트 자원인 쿠키를 이용할 뿐입니다. 세션데이터가 방대하고 복잡하다면 클라이언트 자원인 쿠키를 이용하는데 문제가 발생할 수 있습니다. 또 보안을 요구하는 세션데이터일 경우에는 보안이 취약한 쿠키를 이용할 수 없을 지도 모릅니다. 그러나 많은 경우에 있어서 세션데이터는 그리 복잡하지도 않으며 보안을 요구하지 않을 수도 있습니다. 이러한 경우에는 서버의 파일시스템이나 디비 등을 이용하기 보다는 클라이언트 자원인 쿠키를 이용하는 것이 좋으리라 생각합니다. 동시에 수만명이 접속하는 웹사이트에서 세션을 사용한다면 수만개의 세션파일(또는 세션필드)이 순간적으로 생성되고 삭제되고 하겠지요. 아마 파일시스템으로는 감당하기 힘들 것입니다. 그렇다고 몇가지 안되는 세션데이터때문에 덩치 큰 데이터베이스를 이용하자니 꺼림직할 것입니다. 이때 쿠키에 세션데이터를 저장한다면 이를 위해 서버자원을 전혀 이용하지도 않을 뿐 아니라 각 세션데이터는 각각의 방문자 로컬시스템의 하드디스크(쿠키)에 저장하게 되지요. 서버에 전혀 부담주지도 않으면서 동시에 접속하는 수만명의 방문자를 가뿐히 처리할 수 있겠지요. 이것이 쿠키용 세션핸들러의 최대 장점입니다.
각 저장매체의 장점
세션 데이터를 저장하는 저장매체로는 파일시스템, 데이터베이스, DBM/DBA, 쿠키가 있습니다. PHP4 세션함수에서와 마찬가지로 가장 기본적으로 사용되는 매체는 파일시스템이라고 할 수 있습니다. 그러나 때에 따라서는 데이터베이스와 같은 다른 저장매체를 필요로 하는 경우도 있지요. 다음은 각 매체만이 가지는 장점을 기술하였습니다.
디비용 파일용 DBM/DBA용 쿠키용
복수의 웹서버에서 세션을 공유할 수 있으며, 또한 데이터베이스의 뛰어난 데이터 처리능력을 이용할 수 있습니다.
예를 들어 웹사이트에 동시에 수만명씩 접속한다면 파일시스템으로는 감당할 수 없을 것입니다. 데이터베이스라면 별 무리없이 잘 소화시키겠죠. 가비지 콜렉션(쓰레기 세션데이터 처리)을 수행할 때도 데이터베이스가 파일시스템보다는 막강한 능력을 발휘할 수 있겠죠.
어느 분이 저한테 이메일로 보내온 내용입니다. 매우 적절한 표현인 것 같아 적어봅니다.
저는 DB를 사용하는 세션관리는 필요하지 않고요, ......(중간내용 생략)...... 하지만 뭐랄까요, 소잡는 칼로 닭을 잡는다고나 할까요. 세션으로는 화일 I/O로도 충분하다고 여겨져서요. 일단은 제 생각입니다.
(세셔너를 파이썬을 이용해 포팅하시려는 분의 의견)
덩치 큰 별도의 데이터베이스를 운영할 필요가 없기 때문에 데이터베이스를 지원하지 않는 웹서버에서도 파일시스템만 가지고 데이터베이스의 장점에서 얻을 수 있는 효과를 대부분 얻을 수 있습니다. 동시 접속자가 많은 웹사이트에서 서버 부담을 전혀 주지 않고도 세션함수를 운용할 수 있습니다.
일률적으로 어느 것이 좋다 나쁘다를 떠나서 매체마다 나름대로의 필요성이 있을 것 입니다. 상황에 맞게 적절하게 선택하는 지혜가 필요하겠지요.
제공되는 세션핸들러 함수
session_handler(), session_guests(), session_guest_list(), session_guest_data(), session_guest_decode(), session_event_path(), session_write() 함수들은 세션핸들러에 포함되어 있습니다. 따라서 세셔너 또는 PHP4에서 내장모듈에 의해 세션 핸들링될 때는 사용할 수 없습니다. 이 함수들을 사용하기 위해서는 세셔너함수 또는 PHP4 세션함수의 session_set_save_handler() 함수를 이용하여 사용자 정의 세션 핸들러를 추가해 주셔야 합니다. 세션핸들러가 포함되면 이 함수들은 PHP3와 PHP4에서 모두 동일하게 사용할 수 있습니다.
세션핸들러 함수 파일용 디비용 DBM용 쿠키용 기능
session_handler 0.0.1 0.0.1 0.0.1 0.0.2 사용자정의 세션핸들러 설정
session_guests 0.0.1 0.0.1 0.0.1 - 타방문자수 획득
session_guest_list 0.0.1 0.0.1 0.0.1 - 타방문자 세션ID 획득
session_guest_data 0.0.1 0.0.1 0.0.1 - 타방문자 세션문자열 획득
session_guest_decode 0.0.1 0.0.1 0.0.1 - 타방문자 문자열을 세션변수화
session_event_path 0.0.1 0.0.1 0.0.1 0.0.2 이벤트핸들러 파일 저장패스 설정
session_write - - - 0.0.2 세션데이터를 외부장치에 저장
저장매체에 따라 지원되지 않는 함수들도 모두 내부적으로는 정의되어 있습니다. 단, 내용이 없는 더미함수(dummy function)이므로 실행하더라도 아무런 결과도 수행하지 않습니다. 저장매체간의 코드 작성에 관한 상호호환성을 위해 작성되어 있을 뿐입니다.
예를 들어, 쿠키용의 경우에는 당연히(세션정보가 방문자 로컬시스템에 저장되어 있기 때문에) 타방문자에 대한 정보를 수집할 수가 없습니다. 따라서 session_guests(), session_guest_list(), session_guest_data(), session_guest_decode() 함수를 수행하더라도 어떠한 동작도 하지 않으며 단지 "" 또는 0이라는 값만 되돌려 받을 수 있습니다. 그러니 타방문자에 관하여 모든 저장매체를 위해 동작하는 소스를 작성하려면 아래와 같이 리턴값을 확인하기 바랍니다.
[code php;gutter:false] <?php
.
.
.
$list = session_guest_list();
if (is_array($list)) {
echo "타방문자수 : ".session_guests()."명\n";
while(list(,$id)=each($list)) {
$vars = session_guest_decode(session_guest_data($id));
echo "\$id=$id\n";
while(list($k,$v)=each($vars))
echo "   $k=$v\n";
}
}
.
.
.
?> [/code]
반면에 쿠키용을 제외한 다른 저장매체를 위한 세션핸들러에는 session_write() 함수를 지원하지 않습니다. 그러나 쿠키용과의 소스코드 작성의 호환성을 생각한다면 쿠키용에서와 같은 방법으로 session_write() 함수를 사용하세요. 이 방법은 저 아래쪽에 있는 session_write() 함수 설명을 참조하세요. 이 방법에 의하면 세션변수값을 변경하여 다른 세션페이지로 변경된 값을 넘기기 위해서는 session_write() 함수 이전에 세션변수값을 변경하여 주십시요. 현재 세션값을 읽기만 할 때는 session_write() 함수 전 또는 후의 어느 위치에서 세션변수값을 읽더라도 관계없습니다.
[code php;gutter:false] <?php
.
.
.
session_handler();
session_register("bank");

$bank .= "#"; // 세션변수값을 변경해야 하는 부분

session_write(); // 쿠키용의 경우에는 이곳에서 세션데이터를 쿠키로 저장하며,
// 파일용,디비용,DBM/DBA용의 경우에는 이 함수를 무시하며
// 웹문서 처리가 끝나는 시점에서 세션데이터를
// 해당저장매체에 저장

echo "\$bank=$bank\n"; // 세션변수값을 읽기만 해도 되는 부분
.
.
.
?> [/code]
위에서 echo() 함수는 session_write() 함수 이후에 나타나야 합니다. 쿠키용이 아니면 session_write() 함수가 있으나 없으나 관계없으나 쿠키용과 향후 소스코드 작성에 관하여 호환성을 지키기 위해서는 위와 같은 방법으로 소스를 작성하시는 것이 바람직합니다. 이와 같이 서버에서 처리할 내용과 브라우저에서 처리할 내용을 구분하는 것도 소스 관리나 작성에 있어 효율적인 방법이라고 생각합니다.
세션핸들러 함수 사용법
void session_handler(void)
session_handler() 함수는 아래와 같이 세션핸들러 파일에 정의된 세션핸들러(사용자정의 세션저장함수)를 편하게 설정할 수 있도록 작성되었습니다.
[code php;gutter:false] function session_handler() {
session_set_save_handler("sessOpen"
, "sessClose"
, "sessRead"
, "sessWrite"
, "sessDestroy"
, "sessGc");
} [/code]
길고 복잡한 session_set_save_handler("sessOpen", "sessClose", "sessRead", "sessWrite", "sessDestroy", "sessGc") 대신에 session_handler()를 사용하는 것이 오타도 줄이고 보기도 편한 것 같습니다. 취향이 틀리면 어쩔 수 없지만......
[code php;gutter:false] .
.
.
session_handler(); //<- session_set_save_handler() 함수 대신 사용
session_start();

if ($init) {
session_unset();
session_destroy();
session_handler(); //<- session_set_save_handler() 함수 대신 사용
}
.
.
. [/code]
int session_guests(void)
현방문자(현재 페이지를 세션 중에 있는 방문자)를 제외한 세션 중에 있는 타방문자(현방문자를 제외하고 세션 중에 있는 방문자)가 몇명이나 될까? 이것이 궁금하면 session_guests() 함수를 사용하세요. 주의할 것은 현방문자는 방문자수에 포함되지 않습니다. 따라서 현방문자까지 포함된 전체 방문자수는 session_guests() 함수의 결과값보다 하나 많습니다.
[code php;gutter:false] echo "전체 방문자수는 ".(session_guests()+1)."명입니다.\n"; [/code]
이 함수는 반드시 session_start() 함수를 (명시적이든 암시적이든) 실행한 후에 사용하셔야 합니다.
array session_guest_list(void)
현재 세션 중에 있는 타방문자의 세션ID를 반환합니다. 반환되는 값은 타방문자의 세션ID를 값으로 갖는 단순배열 구조입니다.
[code php;gutter:false] $list = session_guest_list();
if (is_array($list))
while(list(,$id)=each($list))
echo "$id\n"; [/code]
예를 들어 현재 세션 중인 전체 방문자가 4명이라면 아래와 같이 타방문자 3명에 대한 세션ID에 대한 정보를 얻을 수 있습니다.
7f72d6a9c6b18dc516f56504e5abd52a
1e798688fd1f45e9f9640601ed2b2139
5e0135cca40da2af22749f7e5b14815a
이 함수는 반드시 session_start() 함수를 (명시적이든 암시적이든) 실행한 후에 사용하셔야 합니다.
string session_guest_data(string id)
세션ID id에 해당하는 방문자의 세션문자열(예를 들어 access_userid|s:6:"hwooky";access_passwd|s:4:"1234";result_id|b:0;)을 되돌려 줍니다. 세션문자열은 외부저장매체(파일 등)에 저장된 세션 데이터를 의미합니다.
[code php;gutter:false] $list = session_guest_list();
if (is_array($list))
while(list(,$id)=each($list))
echo session_guest_data($id)."\n"; [/code]
array session_guest_decode(string session_string)
세션문자열을 입력받으면 이 문자열을 디코딩하여 얻은 각 세션변수 정보를 연관배열에 담아 되돌려 줍니다. 연관배열의 키는 세션변수명이 담기고, 배열의 값은 세션변수명에 해당하는 값이 담깁니다.
[code php;gutter:false] $list = session_guest_list();
if (is_array($list)) {
while(list(,$id)=each($list)) {
$vars = session_guest_decode(session_guest_data($id));
echo "\$id=$id\n";
while(list($k,$v)=each($vars))
echo "   $k=$v\n";
}
} [/code]
예를 들어 현재 세션 중인 전체 방문자가 4명이라면 아래와 같이 타방문자 3명에 대한 세션ID 및 세션변수에 대한 정보를 얻을 수 있습니다.
$id=7f72d6a9c6b18dc516f56504e5abd52a
bank=#####
bank2=50
bank3=$$$$$
$id=1e798688fd1f45e9f9640601ed2b2139
bank=###############
bank2=150
bank3=$$$$$$$$$$$$$$$
$id=5e0135cca40da2af22749f7e5b14815a
bank=#########
bank2=90
bank3=$$$$$$$$$
void session_event_path(string path)
이벤트 핸들러 함수를 정의한 파일이 위치한 디렉토리를 설정할 때 사용하는 함수입니다. 디폴트 값은 현 웹문서가 위치한 디렉토리(".")입니다. 아래는 현 웹문서가 위치한 디렉토리의 하위디렉토리인 "./event"에 이벤트 파일이 있다는 것을 세션핸들러에게 알려줍니다.
[code php;gutter:false] session_event_path("./event");
session_start(); [/code]
session_event_path() 함수는 반드시 session_start() 함수를 (명시적이든 암시적이든) 실행하기 전에 사용하셔야 합니다.
void session_write(void)
세션데이터는 현재 문서가 웹서버에서 처리가 완료되는 시점에서 자동으로 외부장치(파일, 디비 등등)에 저장됩니다. 이 때 실행되는 세셔너 핸들러는 session_set_save_handler() 함수에서 네번째 인자로 지정하는 함수입니다. 세셔너 핸들러에 이미 지정된 이 함수명은 sessWrite() 함수입니다. 그런데 이 함수를 실행하는데 있어 파일용, 디비용, DBM/DBA용 세션핸들러에서는 전혀 문제가 발생되지 않습니다. 쿠키용 sessWrite() 함수 내에는 header() 함수가 포함되어 있기 때문에 때에 따라서는 세션데이터가 정상적으로 외부장치(쿠키)에 저장이 안됩니다. 다 아시는 것이지만 header() 또는 setcookie() 함수는 브라우저로 출력되는 어떤 코드보다 먼저 나타나야 합니다. 그런데 거의 모든 웹문서에는 브라우저로 출력되는 코드들이 존재하게 됩니다. 이런 웹문서의 처리 과정을 보면 서버에서 종료되는 시점에는 브라우저로 보내는 많은 코드가 이미 처리된 후가 대부분입니다. 쿠키용 sessWrite() 핸들러 함수에는 header() 함수를 이용하여 세션데이터를 쿠키로 굽게됩니다. 그런데 웹서버에서 이미 브라우저로 보내는 코드가 처리되었기 때문에(즉, 응답헤더가 먼저 삐리릭 날라가 버렸기때문에) 응답헤더에 포함되어야 하는 쿠키 정보를 브라우저로 보낼 수가 없게 되는 것입니다.
쿠키용 세션핸들러의 이러한 문제때문에 웹페이지 처리가 종료되는 시점에서 세션데이터를 자동으로 외부장치에 저장하는 것은 대부분 불가능하게 됩니다. 즉, 웹페이지 내에서 브라우저로 보내는 코드가 발생하기 직전에 임의로 세션데이터를 외부장치에 저장하도록 지시하여야 합니다. 이러한 기능을 하는 세션핸들러 함수가 session_write() 함수입니다. 쿠키용에만 필요한 함수이지요.
[code php;gutter:false] <?php

//require("./sessioner/lib.sessioner.php"); // 세셔너 0.2.4
require("./sessioner/handler.cookie.php"); // 세션핸들러(쿠키용) 0.0.2

session_register("bank");
$bank .= "*";
session_write(); // 쿠키용 세션핸들러에만 있는 함수
echo "\$bank = $bank\n\n"; // 브라우저로 보내는 코드를 생성하는 echo() 함수
echo "<A href=$PHP_SELF>반복실행</A>";

?> [/code]
echo() 함수와 같이 브라우저로 보내는 코드를 생성하는 함수 또는 HTML 코드 등이 나타나기 직전에 session_write() 함수를 사용하여야 세션데이터를 쿠키에 저장할 수 있습니다. 코딩 작업할 때 약간의 주의만 기울인다면 이러한 사용상의 제약이 기능구현의 제약으로까지는 이어지지 않을 것입니다.
저장매체에 따라 역할이 달라지는 세션함수
string session_save_path([string path])
파일시스템에서 이 함수는 현제 세션데이터가 저장된 path를 얻거나, 설정하는데 사용됩니다. 이것은 PHP4 세션함수와 같은 역할을 하지요. 그러나 파일시스템이 아니면 파일에 저장되는 것이 아니므로 이 역할이 달라질 수 밖에 없습니다. 저장매체가 디비일 때는 데이터베이스의 테이블명이 대상이며, DBM/DBA일 때는 데이터베이스명이 대상이며, 쿠키일 때는 쿠키이름이 대상입니다. 다음은 각 저장매체에 따라 디폴트로 지정된 값 및 session_save_path() 함수를 이용하여 변경하는 경우에 지정할 수 있는 path의 예를 나타냅니다.
저장매체 기본값 지정예 새로이 지정했을 때 기능
파일용 /tmp ./sessioner path를 ./sessioner라고 지정하면, 발생하는 세션데이터가 현문서가 존재하는 디렉토리(.)의 하위디렉토리 sessioner에 저장됩니다.
디비용 Sessioner mysession path를 mysession라고 지정하면, mysession라는 디비 테이블에 저장됩니다.
DBM/DBA용 /tmp/PHPSESSID ./sessioner/db path를 ./sessioner/db라고 지정하면, 현문서가 존재하는 디렉토리(.)의 하위디렉토리 sessioner에 db라는 파일을 만들어 이 파일(DAM/DBA 디비)에 저장됩니다.
쿠키용 현재 생성된 세션ID 12345678 path를 12345678라고 지정하면, 방문자 로컬시스템의 쿠키파일에 12345678라는 쿠키이름으로 저장됩니다.
예약어
세션핸들러에서 자체적으로 사용하는 전역함수와 전역변수는 아래와 같습니다.
예약된 전역함수
sessEvent()
sessOnStart()
sessOnEnd()
sessOpen()
sessClose()
sessRead()
sessWrite()
sessDestroy()
sessGc()
sessGuestList()
예약된 전역변수
$sessDbmID
$sessBaseObject
$sessCookieData;
이벤트
MS의 ASP를 가지고 놀던 분은 Global.asa라는 파일에 있던 4개의 이벤트에 대하여 알고 있을 것입니다. 세셔너에서는 이 중에 세션과 관련된 Session_OnStart 이벤트와 Session_OnEnd 이벤트를 제공합니다. 이벤트 파일은 디폴트로는 현재 문서 디렉토리에 있는 "event.sessioner.php"라는 파일입니다. 다른 디렉토리를 사용하시려면 객체 생성할 때 아래와 같이 임의의 디렉토리를 지정할 수 있습니다.
[code php;gutter:false] require("./lib.sessioner.php"); // 세셔너를 인클루드함
session_event_path("/tmp"); // 이벤트 파일이 저장되어 있는 디렉토리
session_start(); [/code]
이벤트 함수가 정의되어 있지 않으면 OnStart, OnEnd 이벤트를 무시합니다. 이벤트 파일의 기본 구조는 아래와 같습니다. 사용자가 각 이벤트에 원하는 기능을 기술하시면 됩니다.
[code php;gutter:false] <?php

function sessioner_onStart() {}
function sessioner_onEnd() {}

?> [/code]
sessioner_onStart() 이벤트는 방문자가 세션으로 작성된 웹사이트를 처음 접속할 때 실행되며 다른 방문자와 관계없이 동작합니다. sessioner_onEnd() 이벤트는 세션지속시간(디폴트로 24분으로 설정되어 있음)을 지나 Garbage Collection에 의해 파일이 삭제되기 직전에 동작합니다. 메소드 destroy()를 실행할 때도 동작합니다. 즉, 세션이 시작되는 순간에 sessioner_onStart() 이벤트가 동작되며, 세션이 종료되기 직전에 sessioner_onEnd() 이벤트가 동작됩니다. 이벤트가 동작되는 타이밍이 ASP와 틀릴 수 있으므로 ASP 사용경험자는 이 점에 주의하기 바랍니다.

Posted by 방글24