저장될변수 = gethostbyname ("도메인명");
저장될변수 = gethostbyaddr ("ip주소");


<?
echo gethostbyname ("yahoo.com");
?>
결과는
206.190.60.37

<?
echo gethostbyaddr ("206.190.60.37");
?>
결과는
w2.rc.vip.re4.yahoo.com


isset
-변수가 정의되어 있는지 알아보는 함수, 정의되어 있으면 true , 없으면 false 를 리턴
isset ($변수명);

<?
echo isset($a);
$a=123;
echo isset($a);
?>
결과는 1


is_null
-변수가 정의안되어 있으면 true, 정의되어 있으면 false
isset과 정반대이다

<?
echo is_null ($a);
?>
결과는 1


unset
-정의된 변수를 삭제하는 함수

unset ($변수명);

<?
$a=123;
unset($a);
echo isset ($a);
?>
결과는
false



유닉스에서 쉘명령의 실행
<?
echo `ls -al`;
?>

윈도우즈계열의 서버라면
ls가 아닌 dir 명령어를 실행하면 된다
<?
echo nl2br(`dir`);
?>
결과는
D 드라이브의 볼륨에는 이름이 없습니다.
볼륨 일련 번호: B82A-FEEE

D:\root 디렉터리




핑관련

<?
echo nl2br(`ping -n 1 taeker.com`);
?>
여기서
-n 1 옵션은 1회만 체크하라는 것
리눅스 계열은 -c 1을사용한다
위의 결과는 서버와의 ping이므로

클라이언트와의 ping결과를 보려면 아래와 같이 한다

<?
echo nl2br(`ping -n 1 $REMOTE_ADDR`);
?>
->핑의 대상으로 클라이언트의 ip주소를 넣어 주었으므로,
서버와클라이언트간의 핑테스트 결과가 출력되는 것을 알 수 있다














eval
-소스를 실행해 주는 함수
매개변수에 넣어준 소스를 실행하여결과를 보여주는 유용한 함수

eval ("실행할 소스");

<?
eval ("echo 1;");
?>
결과는 1

위 예제는 echo 1; 이라는 소스를 eval함수로 실행하는 것으로, 아래 소스와 같은 결과를 출력한다
<?
echo 1;
?>

결론적으로 보면
eval (""); 부분을 제거한 것과 같다



<?
eval ("echo 1; ?> 2 <?");
?>
앞의 예처럼 제거해보면

<?
echo 1; ?> 2 <?
?>


<?
echo 1; ?>
2
<?
?>
로 정리할 수 있다..

결과는 1 2





[예제]
php_test.php
<form method="post" action="php_test_ing.php">
<textarea name="source" cols="30" rows="5"> </textarea><br>
<input type=submit value="실행">
</form>


php_test_ing.php
<?
$source= "?>". $source."<?";
$source=stripslashes ($source);
eval ($source);
?>

php.test에다 다음소스를 입력한 후 실행을 클릭해보자 결과는?
<?
$t=date('Y-m-d');
echo "오늘은 $today";
?>

결과는
오늘은 2009-01-24


예전에 파일첨부를 제한하는 파일 중에 php를 제한 하였는데
이러한 이유때문이다



exit
-소스의 실행을 멈추도록 하는 명령어

<?
echo 1;
exit;
echo 2;
?>
결과는 1
-> exit때문에 종료되어서 2는 실행이 안된다.








GD라는 것은 php에서 이미지를다룰 수 있도록 해주는 도구를 말한다

이미지사이즈를 알려주는 함수 GetImageSize
저장될 배열 = GetImageSize ("이미지파일");

형식은 위와 같으며, 저장될배열에는 이미지 파일의 정보가 저장된다.
이때 배열의 원소에는 순서대로 가로사이즈, 세로사이즈, 이미지타입, 사이즈정보가 저장되는데,
사이즈는 픽셀단위로 나타내지고
이미지 타입은 gif는 1, jpg는 2, png는 3으로 저장되며,
사이즈 정보는 <img>태그에 적용될 수 있도록 width와 height가 사용된 형태로 나타내진다

<?
$info = GetImageSize ("banner.gif");
echo "
가로사이즈: $info[0] <br>
세로사이즈: $info[1] <br>
이미지타입: $info[2] <br>
$info[3]";
?>
결과는
가로사이즈: 205
세로사이즈: 20
이미지타입: 1
width="205" height="20"



이미지생성
이미지구분자=ImageCreate (가로,세로);

<?
$image=ImageCreate(300,300); //사이즈가 300*300인 이미지 생성
?>

이미지구분자 = ImageCreateFromGif ("gif파일");
이미지구분자 = ImageCreateFromJpeg ("jpeg파일);
이미지구분자 = ImageCreateFromPng ("png파일);


<?
$image = ImageCreateFromGif ("banner.gif"); //banner.gif를 가져와 이미지생성
?>



ImageDestroy
-이미지를 생성하면 메모리가 사용되므로 나중에는 제거해 줄때 사용되는 함수
ImageDestroy(이미지구분자);

<?
$image = ImageCreateFromGif ("banner.gif");
ImageDestroy ($image); //메모리에서 이미지 제거
?>



이미지출력
ImageGif (이미지 구분자, 저장할 파일이름);
ImageJpeg (이미지 구분자, 저장할 파일이름);
ImagePng (이미지 구분자, 저장할 파일이름);


두번째 매개변수인 저장할 파일이름은 적어주지 않아도 상관은 없다.
그런데 파일이름을 적어주게 되면 적어준 이름으로 이미지가 저장되게 되는데,
이때 해당디렉토리에 쓸 수 있는 권한이 있어야 한다.

<?
$image = ImageCreate (300,300); //사이즈가 300*300인 이미지생성
ImageGif ($image); //이미지출력
ImageDestroy ($image); //메모리에서 이미지 제거
?>

<?
$image = ImageCreateFromGif ("banner.gif"); //baner.gif를가져와 이미지생성
ImageGif ($image); //이미지출력
ImageDestroy ($image); //메모리에서 이미지 제거
?>


색의지정 ImageColorAllocate
색구분자 = ImageColorAllocate (이미지구분자, R,G,B);

<?
$image = ImageCreate (300,300);
$color_blue= ImageColorAllocate ($image, 0,0,255); //파란색설정
ImageGif ($image); //이미지출력
ImageDestroy ($image); //메모리에서 이미지 제거

?>

우리가 보통 사용하는 16진수 칼라코드인 #0000FF 등과 같은 모양을 사용하려면
0x00, 0x0, 0xFF 와 같이 넣어 주면된다
#0000FF 는 파란색이므로 RGB로 나눠보면 00,00,FF가 된다.
그런데 16진수이므로 앞에 0x를 붙여 16진수임을 알려주면 사용이 가능하다

<?
$image = ImageCreate (300,300);
$color_blue= ImageColorAllocate ($image, 0x00,0x00,0xff); //파란색설정
ImageGif ($image); //이미지출력
ImageDestroy ($image); //메모리에서 이미지 제거

?>



그리기

ImageSetPixel
-점을 찍어는 함수
ImageSetPixel (이미지구분자, x좌표, y좌표, 색구분자);

<?
$image = ImageCreate (300,300);
$color_black= ImageColorAllocate ($image, 0x00,0x00,0x00); //검정설정
$color_white= ImageColorAllocate ($image, 0xff, 0xff, 0xff); //흰색
ImageSetPixel ($image, 150,150, $color_white); //(150,150)에 흰색점 찍기
ImageGif ($image); //이미지출력
ImageDestroy ($image); //메모리에서 이미지 제거

?>


ImageLine
-선을 그어주는 함수
ImageLine (이미지구분자, x1좌표, y1좌표, x2좌표, y2좌표, 색구분자);

이미지구분자에 해당하는 이미지에 색 구분자에 해당하는 색으로
(x1,y1) 부터 (x2,y2) 까지의 선을 그어 준다

<?
$image = ImageCreate (300,300);
$color_black= ImageColorAllocate ($image, 0x00,0x00,0x00); //검정설정
$color_white= ImageColorAllocate ($image, 0xff, 0xff, 0xff); //흰색
ImageLine ($image, 0,0,300,300, $color_white); //지정된 점까지 선긋기
ImageGif ($image); //이미지출력
ImageDestroy ($image); //메모리에서 이미지 제거

?>


ImageRectangle
-사각형을 그려주는 함수
ImageRectangle (이미지구분자, x1좌표, y1좌표, x2, y2, 색구분자);

<?
$image = ImageCreate (300,300);
$color_black= ImageColorAllocate ($image, 0x00,0x00,0x00); //검정설정
$color_white= ImageColorAllocate ($image, 0xff, 0xff, 0xff); //흰색
ImageRectangle ($image, 10,10,290,290, $color_white); //지정된 점까지 사각형그리기
ImageGif ($image); //이미지출력
ImageDestroy ($image); //메모리에서 이미지 제거
?>



ImagePolygon
-다각형을 그려주는 함수
ImagePolygon (이미지구분자, 좌표배열, 꼭지점개수, 색구분자);

좌표배열을 바탕으로 꼭지점 개수에 맞는 다각형을 그린다

배열[0]=x1좌표;
배열[1]=y1;
배열[2]=x2;
배열[3]=y2;
.
.
.
이런식의 규칙을 따른다

예를들어
$xy[] = 150;
$xy[] = 10;
$xy[] = 290;
$xy[] = 290;
$xy[] = 10;
$xy[] = 290;

또 다른 방법으로 어레이함수를 이용하면 더 간편하다
$xy = array ( 150,10,290,290,10,290);

<?
$image = ImageCreate (300,300);
$color_black= ImageColorAllocate ($image, 0x00,0x00,0x00); //검정설정
$color_white= ImageColorAllocate ($image, 0xff, 0xff, 0xff); //흰색
$xy = array ( 150,10,290,290,10,290); //좌표배열생성
ImagePolygon ($image, $xy, 3, $color_white); //꼭지점이 3개인 다각형 그리기
ImageGif ($image); //이미지출력
ImageDestroy ($image); //메모리에서 이미지 제거
?>



ImageArc
-원을 그려주는 함수, 매개변수 조정으로 정원, 타원, 호를 그릴수도 있다.
ImageArc (이미지구분자, x좌표, y좌표, 폭, 높이, 시작위치, 종료위치, 색구분자);

<?
$image = ImageCreate (300,300);
$color_black= ImageColorAllocate ($image, 0x00,0x00,0x00); //검정설정
$color_white= ImageColorAllocate ($image, 0xff, 0xff, 0xff); //흰색
ImageArc ($image, 150,150,200,200,0,360, $color_white); //원그리기
ImageGif ($image); //이미지출력
ImageDestroy ($image); //메모리에서 이미지 제거
?>




색칠하기 ImageFill
ImageFill (이미지구분자, x좌표, y좌표, 색구분자);
(x,y)에 해당하는 위치가 속해있는 공간을 칠해준다

<?
$image = ImageCreate (300,300);
$color_black= ImageColorAllocate ($image, 0x00,0x00,0x00); //검정설정
$color_white= ImageColorAllocate ($image, 0xff, 0xff, 0xff); //흰색
ImageArc ($image, 150,150,200,200,0,360, $color_white); //원그리기
ImageFill ($image, 100,100, $color_white); //점이 속해 있는 공간 칠하기
ImageGif ($image); //이미지출력
ImageDestroy ($image); //메모리에서 이미지 제거
?>


글씨쓰기

ImageString (이미지구분자, 폰트크기, x좌표, y좌표, 문자열, 색구분자);
주어진위치에 문장열을 입력해 준다

<?
$image = ImageCreate (300,300);
$color_black= ImageColorAllocate ($image, 0x00,0x00,0x00); //검정설정
$color_white= ImageColorAllocate ($image, 0xff, 0xff, 0xff); //흰색
//ImageArc ($image, 150,150,200,200,0,360, $color_white); //원그리기
ImageString ($image, 5,100,150, "taeker", $color_white); //(100,150)에 taeker입력
ImageGif ($image); //이미지출력
ImageDestroy ($image); //메모리에서 이미지 제거
?>


ImageTTFtext
원하는 트루타입폰트로 다양한 문자 표현을 할 수 있도록 하는 함수
ImageTTFtext (이미지구분자, 크기, 각도, x좌표, y좌표, 색구분자, TTF파일, 문자열);

<?
$image = ImageCreate (300,300);
$color_black= ImageColorAllocate ($image, 0x00,0x00,0x00); //검정설정
$color_white= ImageColorAllocate ($image, 0xff, 0xff, 0xff); //흰색
//ImageArc ($image, 150,150,200,200,0,360, $color_white); //원그리기
ImageTTFtext ($image, 30,45,100,150, $color_white, "moon.ttf", "taeker"); //원하는 폰트로 글씨쓰기
ImageGif ($image); //이미지출력
ImageDestroy ($image); //메모리에서 이미지 제거
?>


[예제]
<?
$image = ImageCreate (500,400); //500*400이미지생성
$color_black= ImageColorAllocate ($image, 0x00,0x00,0x00); //검정설정
$color_white= ImageColorAllocate ($image, 0xff, 0xff, 0xff); //흰색
ImageRectangle($image, 50,50,450,350, $color_white); // (50,50)부터 (450,350)까지 흰색의 사각형그리기

for  ($i=150; $i <= 350; $i=$i+100) { //세로눈금그리기
 ImageLine ($image, $i, 50,$i,350,$color_white);
}

for ($i=100; $i <=300; $i=$i+50) {//가로눈금그리기
 ImageLine( $image, 50,$i, 450, $i, $color_white);
}

$data = array (148,212,150,292); //데이터
ImageLine ($image, 150, 350-$data[0], 250, 350-$data[1], $color_white);//그래프그리기
ImageLine ($image, 250, 350-$data[1], 350, 350-$data[2], $color_white);
ImageLine ($image, 350, 350-$data[2], 450, 350-$data[3], $color_white);
//ImageArc ($image, 150,150,200,200,0,360, $color_white); //원그리기
//ImageTTFtext ($image, 30,45,100,150, $color_white, "moon.ttf", "taeker"); //원하는 폰트로 글씨쓰기
ImageGif ($image); //이미지출력
ImageDestroy ($image); //메모리에서 이미지 제거
?>



메일을 사용하기 위해서는
php.ini 에서설정을 해주어야 한다

SMTP = mail.hanafos.com
sendmail_from =
naver@daum.net


php의 유용한 함수 중 ini_set함수가 있는데
이 함수는 php.ini에 설정된 항목을 직접 수정하지 않고,
현재의 페이지 안에서만 임의로 값을 변경하여 사용할 수 있도록 해주는 함수이다.
<?
ini_set ("SMTP", "mail.hanafos.com");
?>


헤더작성
Return-Path: sender@naver.com
From: nave <aaa@naver.com>
Reply-to: sender@naver.com
Content-Type: text/html charset=euc-kr

html태그를 사용하지 못하게 하려면 text/plain 으로 설정 해주면 된다


완성된헤더를 변수에 넣어준다.
<?
$header = "Return-Path: sender@naver.com
From: nave <aaa@naver.com>
Reply-to: sender@naver.com
Content-Type: text/html charset=euc-kr \n\n";
?>


메일보내기
mail ("받는이주소", "제목", "내용", "메일헤더");

<?
$header = "Return-Path: sender@naver.com
From: nave <aaa@naver.com>
Reply-to: sender@naver.com
Content-Type: text/html charset=euc-kr \n\n";

mail ("love@daum.net", "안녕", "테스트에요", $header);
?>











일반적으로 php에서는 페이지의 소스를 모두 실행하여출력할 내용을
버퍼에 저장해 두었다가, 버퍼가 가득차면 그때 브라우저로 보내주어 출력이 이루어진다

그런데 만약 멈추지 않고 어떤 것을 실행하며 새로운 결과를 계속 웹브라우저로 출력해주어야 하는 작업을 해야만 한다면
이때 사용하는 것이 서버푸시 server push 이다

서버푸시는 버퍼가 차기전에 버퍼를 비우고 버퍼의 내용을 웹브라우저로 보내주는 역할을 한다.

서버푸시를 위한 함수로
flush ()
형식은 위와 같으며, 일반적으로 서버푸시의 성능을 높이기 위해
sleep , usleep이라는 함수를 사용한다

sleep함수는 초 단위로 프로그램실행을 잠시 멈추는 것이고
usleep는 마이크로타임단위로 잠시 멈추는 것이다

예> sleep (1) , usleep(1000000) 하면 1초간 멈춘다

<?
echo "<!-- 서버푸시를 사용하기 전에는 버퍼가 채워져 있어야 함 -->";
echo "<!-- 서버푸시를 사용하기 전에는 버퍼가 채워져 있어야 함 -->";
echo "<!-- 서버푸시를 사용하기 전에는 버퍼가 채워져 있어야 함 -->";
echo "<!-- 서버푸시를 사용하기 전에는 버퍼가 채워져 있어야 함 -->";
echo "<!-- 서버푸시를 사용하기 전에는 버퍼가 채워져 있어야 함 -->";
echo "<!-- 서버푸시를 사용하기 전에는 버퍼가 채워져 있어야 함 -->";

for ($i=1; $i<100; $i++){
 echo "서버푸시예제";
 flush();
 sleep(1);
}
?>
결과는
서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제서버푸시예제








1.방문자가 사이트에 접속
2.현재의 시간과 방문자의 ip체크
  각 파일들의 생성시간과 현재 시간과의 차가 20초 이상인 파일을 삭제
3.ip를 이름으로 갖는 텍스트 파일을 생성(now라는 하위 디렉토리를 미리 만들어준다)
4.파일의 개수를 세어 출력

<?
$time = time(); //현재 시간저장
$ip =$REMOTE_ADDR; //방문자의 IP저장

$result =opendir("now"); //now에 있는 파일이름 꺼내기
while ($file =readdir ($result)) {
 if ($file == "." || $file == "..") {continue;} //파일이름이 . 또는 .. 일 경우 무시하고 넘어가기
 $visit = filemtime ("now/$file"); //파일의 생성시간 구하기
 $out = $time - $visit; //방문자의 접속시간
 if ($out >20) {unlink ("now/$file");} //접속 유지시간이 지난 사용자 삭제
}
$fp=fopen ("now/$ip", "w"); //파일 쓰기모드로 열기
fwrite($fp, "0"); //파일생성, 그 내용은 0
fclose($fp); //파일포인터 닫기


$result =opendir("now"); //now에 있는 파일이름 꺼내기
while ($file =readdir ($result)) {
 if ($file == "." || $file == "..") {continue;} //파일이름이 . 또는 .. 일 경우 무시하고 넘어가기
 $i++; //현재 접속자의 수 증가
}

echo "현재 $i 명의 접속자가 있습니다";
?>




파일업로드하기
php.ini파일에서 파일업로드가 가능하게끔
설정을 변경해 주어야 한다

file_uploads = On

upload_tmp_dir = "d:/temp"

upload_max_filesize = 2M

이렇게 설정해 준다음 서버를 중지한다음 재시작해 준다.

업로드 폼파일을 upload.php 라 하고
폼이 전송되는 파일을 uploading.php 라 해 준다음
upload.php파일을 만들자

upload.php
<form method="post" action="uploading.php" enctype="multipart/form-data">
<input type="file" name="data" size="20">
<br><input type=submit value="파일업로드하기">
</form>
여기서 file로 전송된 변수 $data는 다른 부수적 변수를 만들어 낸다
$data - 업로드된 파일 그 자체
$data_name - 업로드된 파일의 이름
$data_size - 업로드된 파일의 크기
$data_type - 업로드된 파일의 MIME TYPE

업로드된파일은 우리가 지정해준 upload_tmp_dir 에 임시 저장되는데,
이 파일을 우리가 넣어주려는 file이라는 디렉토리로 옮겨 주어야만 한다
이때 사용하는 함수가
move_uploaded_file 이다
move_uploaded_file ("원본파일", "사본파일");


uploading.php
<?
move_uploaded_file($data, "file/$data_name");
echo "
이름: $data_name <br>
크기: $data_size <br>
종류: $data_type <br>";
?>


보안에 관해 생각해 볼점
위의 예제처럼 하면 보안에 심각한 문제가 생기는데 이를 해결하기 위한 방법으로

1.파일이 업로드 될때 임의의 확장자로 파일의 확장자를 변경하여
웹에서 실행되지 않도록 하는 방법

2. php나 html과 같은 확장자의 업로드를 미리 제한하여 애초에 업로드가 이루어 지지 않게 하도록 하는 방법

첫번째 방법이라면 move_uploaded_file함수의 두번째 매개변수에서
사본의 파일의 이름뒤에 .file 과 같은 확장자를 뒤에 붙여 웹에서 실행되지 않게 하면된다.
하지만 이 방법은 다시 파일을 웹상에서 꺼내올때 붙였던 확장자를 제거하는 번거로움이 따른다.

두번째 방법은 파일이 업로드 되었을때 확장자를 확인하여 php나 html과 같은 확장자일 경우 업로드 하지 않도록 하는 거이다. 정규표현식으로 구현할 수 있다.
uploading.php
<?
if (eregi("\.php$|\.html$", $data_name)) {echo "업로드 불능파일입니다"; exit;}
move_uploaded_file($data, "file/$data_name");
echo "
이름: $data_name <br>
크기: $data_size <br>
종류: $data_type <br>";
?>


첨부파일이름중복에 관한 문제
같은 이름의 파일을 두번 올렸을때 기존파일은 삭제되고 새로운 파일만 남게될 수 있는데
이를 해결하기 위해서는

1. 새로운 파일뒤에 적절한 구분자를 붙여 새로운 이름의 파일로 바꾸어 주는 것
2. 각 파일을 유일한 이름의 디렉토리 안에 구분하여 집어넣는것

두번째 방법은 유일한 디렉토리를 만드는 것이 이슈인데 이때 가장 간단한 바업은
시간함수를 적절히 사용하는 것이다.
유닉스타임스탬프값과 마이크로 타임을 적절히 섞어서 디렉토리의 이름으로 사용한다면
디렉토리의 이름이 겹칠확률은 0%에 가깝다고 봐도 된다
<?
echo time()."@".(double)microtime();
?>
결과는 1232470685@0.343753

uploading.php
<?
if (eregi("\.php$|\.html$", $data_name)) {echo "업로드 불능파일입니다"; exit;}

$dir=time()."@".(double)microtime(); //디렉토리 이름 구하기
mkdir("file/$dir", 0777); //디렉토리 생성

move_uploaded_file($data, "file/$dir/$data_name");

echo "
이름: $data_name <br>
크기: $data_size <br>
종류: $data_type <br>";
?>
이 방법은 파일이름 중복을 막는 것 이외에도
보안적인 측면에서 업로드된파일의 무단링크를 어느 정도 막아주는 역할을한다

<?
$fp= fopen ("test.txt", "r");
$size=filesize("test.txt");
$counter=fread($fp, $size);
fclose($fp);

$counter++; //방문자수 증가

$fp=fopen("test.txt", "w");
fwrite($fp, $counter); //방문자 수 기록
fclose($fp);

echo "당신은 $counter 번째 방문자입니다";
?>

[참고]
여기에 쿠키를 사용하여
쿠키가 있으면 카운팅을 하지 않고,쿠키가 없으면 카운팅을 한 다음에
쿠키를 구워주는 식으로 계속되는 카운팅을 방지할 수 있으며,

방문시간을 함께 저장하여 오늘 방문자 또는 어제 방문자 등을 따로 카운팅할 수도 있을 것이다.

fwrite ("파일포인터", "내용", 길이);
-주어진 파일포인터에 입력된 내용을 길이만큼 저장

만약 내용이 길이보다 짧으면 모두 저장하고,
내용이 길이보다 길면 주어진 길이만큼 저장,
길이를 생략하면 내용 모두를 저장한다.

파일을 쓰기 위해서는 fopen으로 열어주어야 하는데,
이때 모드를 쓰기모드로 해주어야 한다.

<?
$fp=fopen ("test.txt", "w");
fwrite ($fp, "파일쓰기 테스트");
fclose ($fp);
?>
파일을 열어보면 내용이 바뀐 것을 알 수 있다.

만약 퍼미션관련 에러 메시지가 발생한다면
파일 퍼미션을 707또는 777로 바꿔주자


파일복사
copy ("원본파일", "사본파일");

이때 복사가 되는 디렉토리의 퍼미션이 707 또는 777로 public에게 모든 권한이 주어져 있어야 한다

<?
copy ("test.txt", "copy/test.txt");
?>


파일삭제
unlink ("삭제할 파일");


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과 같이 적당하게 주어서
빠르고 서버에 부담이 없게 파일의 내용을 읽어오도록 지정해 주는 것이 좋다.



+ Recent posts