file
-가장 간편하게 파일의 내용을 가져올 수 있는 함수로
포인터가 열려 있지 않아도 파일의 내용을 모두 가져올 수가 있다.
단, 내용을 줄단위로 구분하여 배열로 리턴하는데,

예를들어 파일 내용의 첫 번째 줄을 배열 원소 0으로 리턴하며, 두 번째 줄을 배열원소 1로 리턴한다.

저장될 배열  = file ("파일이름");

<?
$file = file("test.txt");
$size = sizeof($file);

for ($i=0; $i < $size; $i++){
 echo $file[$i];
}
?>
결과는
ABC DEF GHI
-> test.txt파일은 3줄로 되어 있으므로
for문은 0-2까지 돌게 되어 $file[0], $file[1], $file[2] 를 출력하게 된다

이때도 배열 원소를 하나하나 출력하는 것보다는
한꺼번에저장해 놓고 출력해주는 것이 좋다.



fgetc
-fgets에서는 지정된 길이만큼의 내용을 읽어오는 것과는
달리 항상 1바이트의 문자만을 읽어온다.
저장될 변수 = fgetc ("파일포인터");

<?
$fp=fopen ("test.txt", "r");
echo fgetc ($fp);
?>
결과는 A



fgetss
-기본적으로 fgets와 그 형식은 같지만,
가져올때 html이나 php구문은 제외하고 가져온다.
저장될 변수 = fgetss ("파일포인터", 길이);

a.txt를 만들고
<b>A</b>
라고 작성하여 보자

<?
$fp=fopen ("a.txt", "r");
echo fgets($fp, 2048);
?>
결과는 A

<?
$fp=fopen ("a.txt", "r");
echo fgetss($fp, 2048);
?>
결과는 A



fread
-fgets와 비슷한 기능을 갖는 함수로
파일포인터에서부터 정해준 길이만큼의 내용을 가져온다.

그런데 fread는 바이너리 형식으로 가져오기에
텍스트형식이 아닌 exe나 zip또는 이미지 등의 파일을 그대로 가져올 수 있다.
fread ("파일포인터", 길이);

<?
$fp=fopen ("banner.gif", "r");
$size=filesize("banner.gif");
echo fread($fp, $size);
?>








파일열기
저장될 변수 = fopen ("파일명", "모드");

fopen함수는 파일명을 정해진 모드로 열어서 저장될 변수에 저장하는데
이때 저장되는 것을 파일 포인터라고 부른다.

파일포인터란,
파일을 읽거나 쓰기 위한 현재의 위치를 말하는 것으로
디렉토리의 핸들과 같은 개념

모드는
파일을 여는 목적을 알려주는 것으로
 모드 사용목적  포인터위치 
 r 읽기전용   파일의 시작 위치
 r+ 읽기,쓰기  파일의 시작 위치 
 w 쓰기전용,
파일이 없으면 새로생성,
기존의 내용 삭제 
  파일의 시작 위치
 w+  읽기,쓰기,
파일이 없으면 새로 생성,
기존의 내용 삭제
  파일의 시작 위치
 a  쓰기전용
파일이 없으면 새로 생성
  파일의 마지막 위치
 a+  읽기, 쓰기,
파일이 없으면 새로 생성
  파일의 마지막 위치


(여기서 $fp는 파일 포인터가 저장되는 변수)
$fp = fopen ("test.txt", "w"); //현재 서버의 test.txt를 쓰기전용으로 열기
$fp = fopen ("http://daum.net" ,  "r"); //daum.net 의 index를 읽기전용으로 열기
$fp = fopen (ftp://id@pass:daum.net , "r" ); //ftp://daum.net을 읽기전용으로 열기


fopen은 파일의 포인터만 저장한 것이지
내용을 가져오지는 않는다
디렉토리에서의 readdir함수와 마찬가지로 파일의 내용을 읽어오는 함수가 바로
fgets함수이다
저장될 변수 = fgets( "파일포인터", 길이);
파일포인터가 위치한 부분부터 정해준 길이만큼 읽어 저장될 변수에
읽어온 내용을 저장하는데,
이 함수는 기본적으로 1바이트를 소요하므로, 1바이트를 읽기 위해서는
길이를 2로 지정해주어야 한다

<?
$fp = fopen ("test.txt", "r");
echo fgets ($fp, 2);
?>
결과는 A
->영문1자는 1바이트이지만
fgets함수가 기본적으로 1바이트를 사용하므로,
즉 1바이트인 영문1자를 읽어와 출력
-> 그 후 파일포인터는 그 다음문자인 B로 넘어간다

<?
$fp = fopen ("test.txt", "r");
echo fgets ($fp, 2);
echo fgets ($fp, 2);
?>
결과는
AB

while을 사용하여 test.txt의 내용을 모두 읽어오려면
<?
$fp = fopen ("test.txt", "r");
while ($file = fgets($fp,2)) {
 echo $file;
}
?>
결과는
ABC DEF GHI

echo문의 특성상 위와 같이 반복적으로 한 글자씩 출력하는 방법은 좋지않다.
내용이 많은 파일인 경우 위의소스는 많은 시간을 소요하게 될 것이다

따라서 while문 안에서 읽어오는 내용을 하나의 변수에 차곡차곡 넣어주고
while문이끝나면 한꺼번에 출력해주는 방법을 사용하는 것이 좋다
<?
$fp = fopen ("test.txt", "r");
while ($file = fgets($fp,2)) {
 $result .= $file;
}
echo $result;
?>
-> $a .= $b는 $a = $a . $b 와 같기에

원래 test.txt파일의 모양처럼
ABC
DEF
GHI
의 모양으로 출력하고 싶다면
nl2br함수를 사용하여
\n<br>로 만들어 주어야 한다

<?
$fp = fopen ("test.txt", "r");
while ($file = fgets($fp,2)) {
 $result .= $file;
}
echo nl2br($result);
?>
결과는
ABC
DEF
GHI



마지막으로
fclose함수를 사용하여 파일포인터를 닫아 주어야 한다
fclose ("파일포인터");
-파일포인터닫기

파일포인터가 파일의 끝까지 모두 이동하였는지 알아보는방법
feof ("파일포인터");
-파일포인터가 파일의 끝에 위치하는지를 알려주는 함수로
파일의 긑에 있으면 true, 아니면 false를 리턴

<?
$fp = fopen ("test.txt", "r");
while ($file = fgets($fp,2)) {
 $result .= $file;
}
echo nl2br($result);
echo feof($fp);
fclose ($fp);
?>
결과는
ABC
DEF
GHI1
->여기서 1은 모든 내용을 읽어 왔다는 것을 나타낸다


참고!
물론 fgets함수에서 길이를 2바이트로 한다는 것을
while문이 반복되는 횟수를 늘리게 되어 서버에 부하를 주고,
읽어오는 속도가 느려지게 되므로

길이를 1024나 2048, 4096과 같이 적당하게 주어서
빠르고 서버에 부담이 없게 파일의 내용을 읽어오도록 지정해 주는 것이 좋다.



파일정보꺼내기

-주의점-
파일정보에 관련된 함수들은모두 그 결과가 메모리에 저장되어 있는 것들이므로, 항상 위의 함수를 사용하기 전, 후에는 clearstatcache함수를 호출하여 메모리를 비워주어야 한다.


stat
-지정된 파일의 여러가지 정보를 배열로 저장해 주는 함수
이 함수만으로도 파일에 대한 대부분의 정보를 가져올 수 있다
저장될 배열 = stat ("파일이름");

배열원소 7 - 파일의 크기
배열원소 8 - 마지막으로 접근된 시간 (유닉스타임스탬프)
배열원소 9 - 마지막으로 수정된 시간 (상동)

stat함수에서 리턴된 배열은 배열원ㅅ 0-12까지 13개의 정보를 저장하고 있지만
실제로 우리가 사용하는 정보는 위의 3가지 이다.


임의의 test.txt 파일을 서버루트에 만들고
우리가 만든 test.txt파일을 stat함수로 꺼내보자
<?
$file = stat("test.txt");
echo "
파일크기 : $file[7] <br>
마지막 접근시간:$file[8] <br>
마지막수정시간:$file[9] ";
?>
결과는
파일크기 : 13
마지막 접근시간:1232376054
마지막수정시간:1232376054

<?
$file = stat("test.txt");
echo "
파일크기 : $file[7] <br>
마지막 접근시간: ".date('Y-m-d H:i:s', $file[8])." <br>
마지막수정시간: ".date('Y-m-d H:i:s', $file[9]);
?>
결과는
파일크기 : 13
마지막 접근시간: 2009-01-19 23:40:54
마지막수정시간: 2009-01-19 23:40:54



filesize
-파일의 크기를 구하는 함수
filesize ("파일이름");

<?
echo filesize("test.txt");
?>



fileatime
-파일의 마지막 접근 시간을구하는 함수
fileatime("파일이름");

<?
echo date ('Y-m-d H:i:s', fileatime("test.txt"));
?>
결과는 2009-01-19 23:40:54




filemtime
-파일의 마지막 수정시간을 구하는 함수
filemtime ("파일이름");



fileperms
-파일의 퍼미션을 구하는 함수
fileperms ("파일이름");

<?
echo fileperms("test.txt");
?>
결과는 33206
->우리가 알고 있는 707(8진수) 이런 모양이 아닌데
그것은 함수가 10진수의 퍼미션을 알려주기 때문이다.
진수변경함수인 base_convert함수를 사용하여 10->8진수로 변경해야 한다

<?
$perms= fileperms("test.txt");
echo base_convert ($perms, 10, 8);
?>
결과는 100666
-> 퍼미션은 666 이다




file_exists
-어떤 파일이 존재하는지 알아보는 함수
존재하면 true, 없으면 false를 리턴
file_exists ("파일이름");

<?
echo file_exists("test.txt");
?>
결과는 1










디렉토리생성

mkdir("디렉토리이름", 퍼미션)

<?
mkdir ("a", 0777);
?>
결과 디렉토리a가 생성된 걸 알 수 있다.

다시 한번 위 예제를 실행하면 에러가 나는데
이미 존재하는 디렉토리를 또 생성할 수 없기때문

에러 메시지를 안 보이게 하려면 함수 앞에 @를 붙여주면 된다.

<?
@mkdir ("a", 0777);
?>



디렉토리삭제
rmdir ("디렉토리이름");

<?
@rmdir ("a");
?>



디렉토리열기
저장할변수=opendir("디렉토리이름");

<?
$result = opendir("test");
while ($file=readdir($result)){
 echo "$file <br>";
}
closedir($result);
?>
결과는
.
..
index.php.bak
login.php.bak
logout.php
logout.php.bak
result.php
result.php.bak
->test폴더 안에 있는 파일들의 이름을 출력해준다

만약 현재파일이 있는 서버의 루트 (d:\root)의 파일을 열려고 한다면
opendir의 디렉토리 이름에 ./라고 넣어주면 되고
상위디렉토리를 열기 위해서는 ../ 을 사용한다.

opendir을 이용하여 디렉토리 정보를 열어준 것은 디렉토리핸들 이라고 한다
이는 디렉토리의 위치를 잡아준것이다.
그 후 디렉토리핸들을 이용하여 디렉토리정보를 꺼내야하는데
이때 사용되는 것이 readdir함수이다

저장될 변수 = readdir("디렉토리핸들");





split함수는
explode함수처럼 문자열을 배열로 만들어주는 함수이지만
역시 정규표현식의 사용이 가능하다는 점이 다르다.

저장될 배열 = split ("정규표현식", 문자열);
-> 정규표현식에 통과되는 패턴을 기준으로 배열을 나누어 저장될 배열에 저장한다

<?
$a="a0b1c2d";
$b=split ("[0-9]", $a);
echo "$b[0] $b[1] $b[2] $b[3]";
?>
결과는 a b c d












ereg_replace함수는 정규 표현식을 이용하여 문자열을 치환할 수 있다.

저장될 변수 = ereg_replace ("정규표현식", "치환될문자", 문자열);
->정규표현식에 해당되는 패턴부분이 치환될 문자로 치환된다


<?
$a="abcde";
$b=ereg_replace ("[b-d]", "x", $a); //b에서 d까지의 문자를 x로 치환

echo $b;
?>
결과는
axxxe



이메일주소와 홈페이지주소 자동링크
이메일주소 정규표현식을 이용하면쉽게 자동링크를 시켜 줄수가 있다.
우선 이메일주소는 어떤문장속에 있는 것이기 때문에
정규표현식에서 시작과 끝을 의미하는 ^와 $는 제거한다.
그리고 자동링크를 위해
ereg_replace함수에 정규표현식을 넣어준다.

<?
$ex="^[-_a-z0-9]+(\.[-_a-z0-9]+)*@[_a-z0-9]+(\.[_a-z0-9]+)+$";
$b=ereg_replace($ex, " ", $a);
?>
그런데 여기서 무어으로 치환해 주어야 할까?
ereg_replace함수에서는 \\라는 특수문자를 사용하여 정규표현식에 해당하는
패턴의 내용을 그대로 사용할 수가 있는데,
\\0은 전체의 내용을 그대로 받아오게 한다

<?
$a="제 이멜주소는 naver@nate.com 입니다";
$ex="[-_a-z0-9]+(\.[-_a-z0-9]+)*@[_a-z0-9]+(\.[_a-z0-9]+)+";
$b=ereg_replace($ex, "<a href='mailto:\\0'>\\0</a>", $a);
echo $b;
?>

홈페이지주소도 마찬가지로 하면된다
<?
$a="제 이멜주소는 naver@nate.com 입니다";
$b="제 홈페이지 주소는 http://taeker.com 입니다";
$ex="[-_a-z0-9]+(\.[-_a-z0-9]+)*@[_a-z0-9]+(\.[_a-z0-9]+)+";
$ex2="http://[_a-z0-9]+(\.[_a-z0-9]+)*(/[^\\\/:\*\"<>\|]+(\.[^\\\/:\*\"<>\|]+)*)*/?";
$c=ereg_replace($ex2, "<a href='\\0' target=_blank>\\0</a>", $b);
echo "$c ;
?>









<?
$a="navy@nate.com";
$ex="^[-_a-z0-9]+(\.[-_a-z0-9]+)*@[_a-z0-9]+(\.[_a-z0-9]+)+$";
echo eregi($ex, $a);
?>


홈페이지주소
$ex="^http://[_a-z0-9]+(\.[_a-z0-9]+)*(/[-a-z0-9]+(\.[-a-z0-9]+)*)*/?$


디렉토리/파일명에 해당하는 부분은 서버명과는달리
\, /, :, *, ", <, >, | 이외의 문자는 모두 올 수 있으므로 [^]을 이용하여 보자
$ex="^http://[_a-z0-9]+(\.[_a-z0-9]+)*(/[^\\\/:\*\"<>\|]+(\.[^\\\/:\*\"<>\|]+)*)*/?$


<?
$a="http://naver.com/index.php";
$ex="^http://[_a-z0-9]+(\.[_a-z0-9]+)*(/[^\\\/:\*\"<>\|]+(\.[^\\\/:\*\"<>\|]+)*)*/?$";

echo eregi($ex, $a);
?>
결과는 1

정규표현식 Regular Expression
-어떠한 값이 특정한 형태를 갖는지 검사하는 도구
주로 폼에 입력된 데이터를 검사하기 위해 이용됨

예를들어, 숫자로 된 값만을 취하여 할때라거나,
이메일 주소가 형식에 맞는지 검사할때 등


문자열이 포함되어 있는가? ereg, eregi
-문자열에 어떤 문자가 포함되어 있는가를 검사하는 함수
저장될 변수 = ereg ("검사할문자", "검사대상문자열");

검사후 포함되어 있다면 TRUE
불포함이면 FALSE를 리턴한다.

<?
$a="abced";
echo ereg ("b", $a );
?>
결과는 1


<?
$a="abced";
echo ereg ("B", $a );
?>
결과는 없음


<?
$a="abced";
echo eregi ("B", $a );
?>
결과는 1
->ereg는 대소문자를 구분하지만
 eregi는 대소문자를 구분하지 않는다



시작과 끝 ^, $
^ - 문자열의 시작을 의미
$ - 문자열의 끝을 의미


<?
$a="abced";
echo eregi ("^a", $a );
?>
결과는 1

<?
$a="abc";
echo ereg ("c$", $a );
?>
결과는 1

대상문자열이 abc 일때 결과를 보자
^a - a로 시작하는 문자열 -> true
c$ - c로 끝나는 문자열 -> true
^ab - ab로 시작하는문자열 -> true
abc - abc를 포함하는 문자열 ->true
^abc$ - abc인 문자열 -> true



문자의 반복 *, +, ?
* - 0개 또는 1개이상
+ - 1개 또는 1개이상
? - 0개 또는 1개

abc* -> ab뒤에 c가 0개 또는 1개 이상이는 문자열을 말함 예>ab, abc, abcc, abccc.....
abc+ -> ab뒤에 c가 1개 또는 1개 이상있는 문자열 -> 예>abc,abcc, abccc....
abc? -> ab뒤에 c가 0개 또는 1개 있는 문자열  예> ab, abc

<?
$a="abccc";
echo ereg ("abc*", $a );
?>
결과는 1


반복횟수의 지정 {}
*,+,? 대신 {}를 사용하여 문자의 반복을 결정해 줄 수 있다.
문자{최소개수, 최대개수}

예를들어
abc{1,2} 라고하였다면 ab뒤에 c가 1개 또는 2개가 있다는 것으로 abc, abcc를 의미함

여기서 최소 개수는 꼭 적어주어야 하지만 {1, }와 같이 최대 개수를 적어주지 않으면
1개또는 1개 이상을 뜻하게 되고

{3}과 같이 하나의 숫자만을 적어 주었다면 3개만을 나타나게 된다


 연산자 {}로 표현 
 * {0, } 
 +  {1, }
 ?  {0, 1}

<?
$a="abccc";
echo ereg ("abc{2,3}", $a );
?>
결과는 1




문자열의 지정 ()
a 뒤에 bc 가 2개에서 3개 있는 문자열을 지정하기 위해서는 a(bc){2,3} 으로
b,c를 묶어준다.

<?
$a="abcbc";
echo ereg ("a(bc){2,3}", $a );
?>
결과는 1



OR연산 |
대상문자열이 abc 라고 할때
^a | c$ - a로 시작하거나 c로 끝나는 문자열 ->true
^(ab) | (bc)$ - ab로 시작하거나 bc로 끝나는 문자열 -> true

<?
$a="abc";
echo ereg ("^a | b$", $a );
?>
결과는 1



어떤한문자 .
특정한 문자가 아닌 어떤 하나의 문자를 의미하는 연산자로 . 이 있다.

예를들어
.{3} 을 보면 .은 하나의 문자를 의미하므로 .{3}은 3개의 문자를 말한다.
그런데 .{3}이라고만 하면 3개의 문자를 포함한다는 얘기이므로 4개의 문자라도 true가 된다
그렇기에 정확히 3개의 문자로 지정하기 위해 ^와 $를 붙여준다
^.{3}$

<?
$a="abc";
echo ereg ("^.{3}$", $a ); //3개의 문자로 구성된 문자열
?>
결과는 1

<?
$a="abcd";
echo ereg ("^a.{2}d$", $a ); //a와 d사이에 2개의 문자가 있는 문자열
?>
결과는 1



사용 가능한 문자열의 지정 []
예를들어 생년월일을 입력받는데 숫자로만 입력받고 싶다면?
또는 알파벳이나 특수문자를 구분하여 검사할때 사용하는 것이 []이다.

[abc] - abc로만 이루어진 문자열
[a-c] - a에서 c까지의 문자로만 이루어진 문자열
[a-z] - a에서 z까지의 문자로만 이루어진 문자열
[A-Z] - A에서 Z까지의 문자로만이루어진 문자열
[a-zA-Z] - a에서 z까지와 A에서 Z까지의 문자로만 이루어진 문자열
[0-9] - 0에서 9까지의 문자로만 이루어진 문자열
[!@#_0-9] - !, @, #, _  와 0에서 9까지의 문자로만 이루어진 문자열

<?
$a="a3";
echo ereg ("^[a-z][0-9]$", $a ); //a에서 z사이의 한 문자로 시작하고 0에서 9사이의 한 숫자로 끝나는 문자열
?>
결과는 1


<?
$a="abc123";
echo ereg ("^[a-z]{3}[0-9]{3}$", $a ); //a에서 z사이의 문자 3개로 시작하고 0에서 9사이의 숫자 3개로 끝나는 문자열
?>
결과는 1



사용불가능한 문자열의 지정 [^]

[^abc] - a, b, c를 포함하지 않는 문자열
[^a-c] - a에서 c까지의 문자를 포함하지 않는 문자열
[^a-z] - a에서 z까지의 문자를 포함하지 않는 문자열
[^A-Z] - A에서 Z까지의 문자를 포함하지 않는 문자열
[^a-zA-Z] - a에서 z까지와 A에서 Z까지의 문자를 포함하지 않는 문자열
[^0-9] - 0에서 9까지의 숫자를  포함하지 않는 문자열
[^!@#_0-9] - !, @, #, _ 와 0에서 9까지의 숫자를 포함하지 않는 문자열

<?
$a="3a";
echo ereg ("^[^a-z][^0-9]$", $a ); //a에서 z사이의 한 문자로 시작하지 않고 0에서 9사이의 한 숫자로 끝나지 않는 문자열
?>
결과는 1




특수문자의 사용
?가 0개 또는 1개 있는 문자열을 검사한다면 다음과 같을 것이다.
??

위의 정규표현식을 검사하는 예제를 보자

<?
$a="3a";
echo ereg ("^[^a-z][^0-9]$", $a ); // ?가 0개 또는 1개있는 문자열
?>
결과는 에러발생

왜냐하면 ?가 특수문자가 아닌 연산자로 인식되기 때문
즉 ??라고 하면 ? 뒤에 ?연산자가 아니라,
?연산자를 두번 적은것으로 인식되기 때문에 에러가 발생하는 것
이렇게 ?를 연산자가 아닌 특수문자로 지정하기 위해서는 앞에 \를 붙여준다

?이외에도 ^ . [ $ ( ) | + { } \ 와 같은 문자를 연산자가 아닌 특수 문자로 사용하기 위해서는 앞에 \를 붙여주면 된다

그리고 []에 ]를 포함하기 위해서는
[]a-z]와 같이 ]를 가장 처음에 넣어주고,
-는 [-a-z]와 같이 가장 처음이나 [a-z-]와 같이 가장마지막에 넣어주면 된다

<?
$a="?";
echo ereg ("\??", $a ); //?가 0개 또는 1개가 있는 문자열
?>











<?
session_start();

if ($HTTP_SESSION_VARS[counter_session]) {
 $counter_session = $HTTP_SESSION_VARS[counter_ssion]+1;
 session_register (counter_session);
}

else {
 $counter_session = 1;
 session_register(counter_session);
}

$counter =$HTTP_SESSION_VARS[counter_session]+1;
echo "$counter 번째로 방문입니다.";
?>


세션이란
 클라이언트가 서버에 접속해 있는 상태를 말하는 것,
방문자가 웹브랑저를 열어 서버에 접속하고, 다시 웹프라우저를 닫아 서버와의 연결을 종료하는 하나의 단위를 세션이라 한다.

먼저 세션을 시작하면, 서버에서는 세션 아이디라는 것을 생성한다.
이는 클라이언트에게 각각의 유일한 세션 아이디를 부여하여클라이언트를 구분하는 기능을 한다.

그리고 부여한 세션아이디는 클라이언트의 쿠키에 저장된다.
기본적으로 PHPSESSID라는 쿠키로세션아이디가 저장되는데, 이 쿠키의 값으로 세션 아이디가 들어가는 것이다.
그리고 서버측에서는 세션을 저장하는 곳에 그 세션 아이디를 이름으로 갖는 파일을 하나 생성하며, 그 파일에 세션 아이디에 해당하는 클라이언트의 세션 정보가 저장되게 된다.


apm설치할때 수정하는 php.ini
을 보면 세션에 관한 내용이 있다.

[Session]
session.save_handler = files

session.save_path = "d:/temp" //세션이 저장될 경로
session.use_cookies = 1 //클라이언트의 쿠키로 세션 아이디를 저장함

session.name = PHPSESSID //세션아이디를 저장할 쿠키 이름

session.auto_start = 0 // 자동으로 세션을 시작함

session.cookie_lifetime = 0 // 세션아이디를 저장할 쿠키의 폐기시간

session.cookie_path = /   //세션 아이디를 저장할 쿠키 경로

session.cookie_domain =        //세션 아이디를 저장할 쿠키의 도메인


위의 설정을 setcookie함수로 정리해 보면 다음과 같다
setcookie ( "PHPSESSID", "세션아이디", 0, "/", "");



세션의 시작 session_start
세션을 사용하기 전에는 session_start함수를 호출하여, 세션이 시작되는 것을 알려주어야함. 주의할 것은 쿠키와 마찬가지로 세션은 헤더데이터이므로,
세션을 사용하기 전에 어떠한 출력이 있으면 안됨.
session_start();
세션스타트 함수를 호출하고 난다음에 세션을 사용할 수 있다.


세션의 등록 session_register
세션스타트 함수를 호출한 다음 세션을 등록해야 하는데,
쿠키에서의 setcookie의 기능과 비슷하지만 형식은 다르다
$변수명 = "값";
session_register (변수명);

세션을 등록하기 위해서는 일단 변수를 하나 만들고, 값을 넣어준 다음
session_register함수를 호출하고, 매개변수로 변수명을 넣어준다.
이때 변수명에서 $를 제외하고 넣어주어야 하며, 이렇게 되면 변수명에 해당하는 세션이 등록되고 , 그 세션의 값으로 변수의 값이 들어간다.

$변수명1 = "값1";
$변수명2 = "값2";
session_register (변수명1, 변수명2);
위와 같이 여러개를 한번에 세션으로 등록할 수도 있다.



<?
session_start();
$test="세션예제";
session_register(test);
?>

<?
echo $HTTP_COOKIE_VARS[PHPSESSID];
?>
결과 dcd93aff8941d6340285850ea58269c4
->세션아이디를 확인 할 수 있다. 이것은 곧 생성된 파일명앞에 sess_ 를 붙인것과 같다


<?
session_start();
echo $test;
?>
결과 세션예제
->세션의 값을 출력할 수 있다.

<?
session_start();
echo $HTTP_SESSION_VARS[test];
?>
위 위의 예제처럼 $test를 변수로 사용하면, 'index.php?test=값' rhk rkxdms
get방식의 접근에서 엉뚱한 값이 사용되는 경우가 있으므로
$test의 값이 아닌 $HTTP_SESSION_VARS라는 환경변수를 사용한다.




세션의 삭제 session_unregister
$변수명 = "";
session_unregister (변수명);

<?
session_start();
$test="";
session_unregister (test);
 ?>
이렇게 하고 난후
<?
session_start();
echo $HTTP_SESSION_VARS[test];
?>
위처럼하여 test의 세션값을 확인하려고 하면
아무값도 출력이 안되는 걸 알 수 있다. (세션을 삭제했기에)

세션은 삭제되었지만 세션파일이 그대로 남아있는 걸 알 수 있는데
그것은 세션이 폐기되지 않았기 때문이다.



세션의 폐기 session_destroy
-세션을 폐기한다는 것은 세션파일이 저장되는 경로에서 세션파일을 삭제한다는 것이다
클라이언트가 웹브라우저를 종료하여 세션을 종료하였다고 하더라도
서버의 입장에서는 세션이 종료되었는지 알 수 없으므로 이 세션 파일을 계속해서 남아있게 된다.
이때 강제적으로 세션파일들을 삭제하기 위해 session_destroy함수를 사용한다.

<?
session_start();
session_destroy();
?>
실행해보면 세션 파일이 삭제되는 것을 알 수 있다.


php.ini을 다시 보자

session.gc_probability = 1 //세션파일삭제작업을 몇%의 비율로 실행할 것인지를 결정
session.gc_maxlifetime = 1440 //지정된 시간(초)이 지난 세션은 삭제 대상으로 간주함

위 두가지 함수는 우리가 session_destroy함수로 일일이
세션 데이터를 삭제하지 않아도, 자동으로 데이터들을 삭제하도록 설정해주는 것으로
즉 위의 조건하에서는
1440초 (24분)이 지난 세션파일은 폐기 대상으로 간주하겠다는 것이고,
매번 세션을 시작할때, 전체의 1%의 비율로 폐기 작업을 실행한다는 것이다.

예를들어 비율이 1%이고, 세션 작업을 하는 페이지를 100번 실행한다고 하면
100번중 1번만 세션폐기 작업을 실행하게 되는 것이다.
물론 100으로 해주면 100번 모두 폐기 작업을 실행하지만
그만큼 서버의 부하는 늘어나게 된다.

 

+ Recent posts