fopen 함수가 바이너리에 안전하지만 바이너리와 텍스트 파일을 구별할 수 있는 윈도우 시스템에서는 b 플래그는 중요합니다. 그리고 fopen 함수를 사용할때 fputs 함수나 fgets 함수 보다는 fread 함수나 fwrite 함수를 사용하는 것이 권장되며, 바이너리와 텍스트 파일을 구분하지 못하는 유닉스에서는 b 플래그가 필요치 않으나 윈도우환경에서는 중요한 부분입니다. 시스템환경이 바뀔 수 있는 부분이 있다면 b 플래그를 사용하는 것이 좋습니다.


fputs 함수나 fgets 함수로 바이너리로 열거나 작성하더라도 바이너리 자료를 유지하지 못하는  경우가 있으므로 바이너리 자료 그대로 유지되는 fread 함수나 fwrite 함수를 이용하는 것을 권고하고 있습니다.

 <?php
 
if($fp = @fopen('readme.txt''ab+')){
       
fwrite($fp"바이너리로 작성합니다.");
       
fclose($fp);
 }
 
 if(
$fp = @fopen('readme.txt''rb')){
       
fread($fp);
       ob_flush();
       
flush();
       
fclose($fp);
 } else {
     print(
'파일을 찾을 수 없습니다.');
 }
 ?>


관련글:2011/04/22 - [phP 함수 레퍼런스/파일 시스템 함수] - 파일 열기 fopen 함수



블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag fopen

댓글을 달아 주세요

이 기능은 업,다운로드 중 다른 작업을 가능하게 해주는 진보된 기능입니다. 사용 방법은 이전 함수와 크게 다르지 않으니 어렵지 않습니다.

다음은 B 호스트에서 로컬로 다운로드합니다.

예재(ex #1

  <?php 
 
// ftp는 상대경로, 절대경로가 허용되지 않으며,
 // 보통 public_html, www, html 로 시작합니다.
 // public_html/userid 에서 자료를 가져 온다면,
 // ftp 경로는 "public_html/userid/파일" 이 됩니다.

 // B 호스트 정보
 
$ftp_server "호스트 혹은 ip주소"

 
$ftp_user_name "접속 아이디"

 
$ftp_user_pass "접속 패스워드"


 
// B 호스트 접속
 
$conn_id ftp_connect($ftp_server
); 

 
// B 호스트 로그인 
 
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass
); 

 
// 원격으로 B 호스트에서 다운로드합니다.
 // 로컬에 저장할 파일명, 필요시 경로도 같이 작성해 줍니다. 
 
$file 'test_body.php'

 
$fp fopen($file'w'
); 

 
// 원격으로 public_html/userid/test.php 파일을 가져옵니다.
 
$ret ftp_nb_fget($conn_id$fp'public_html/userid/test.php'FTP_BINARY
); 
 
$i 1
;
 while (
$ret == FTP_MOREDATA
) { 

   
// 다운로드중 다른 작업을 작성합니다.
   
echo "${i} \n"
;
   
$i
++;
   
$ret ftp_nb_continue($conn_id
); 
 } 
 if (
$ret != FTP_FINISHED
) { 
      echo 
"다운로드 중 에러가 발생하였습니다."

      exit(
1
); 
 } 
 

 
ftp_close($conn_id
); 
 
fclose($fp
); 
 
?>


다음은 로컬파일을 B 호스트로 업로드합니다.

예제(ex #2

  <?php 
 
// ftp는 상대경로, 절대경로가 허용되지 않으며,
 // 보통 public_html, www, html 로 시작합니다.
 // public_html/userid 에 자료를 저장한다면,
 // ftp 경로는 "public_html/userid/파일" 이 됩니다.

 // B 호스트 정보
 
$ftp_server "호스트 혹은 ip주소"

 
$ftp_user_name "접속 아이디"

 
$ftp_user_pass "접속 패스워드"


 
// B 호스트 접속
 
$conn_id ftp_connect($ftp_server
); 

 
// B 호스트 로그인 
 
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass
); 

 
// 원격으로 전송할 파일
 // 필요시 사용자 업로드 파일을 B 호스트로 전송시
 // $_FILES['userfile']['tmp_name'] 으로 작성하면 됩니다.
 
$file 'test.php'

 
$fp fopen($file'r'
); 

 
// 원격으로 public_html/userid/test.php 파일 이름으로 저장합니다.
 
$ret ftp_nb_fput($conn_id'public_html/userid/test.php'$fpFTP_BINARY
); 
 
$i 1
;
 while (
$ret == FTP_MOREDATA
) { 

   
// 업로드중 다른 작업을 작성합니다.
   
echo "${i} \n"
;
   
$i
++;
   
$ret ftp_nb_continue($conn_id
); 
 } 
 if (
$ret != FTP_FINISHED
) { 
      echo 
"업로드중 에러가 발생하였습니다."

      exit(
1
); 
 } 

 
ftp_close($conn_id
); 
 
fclose($fp
); 
 
?>


다음은 원격 업로드 이어전송하기 및 프로그레스 입니다.

예제(ex #3

  <?php
 ob_end_flush
();
 
$remote_file 'remote.txt'
;
 
$local_file 'local.txt'
;

 
$fp fopen($local_file'r'
);

 
$conn_id ftp_connect($ftp_server
);
 
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass
);

 
$ret ftp_nb_fput($conn_id$remote_file$fpFTP_BINARY
);
 while (
$ret == FTP_MOREDATA
) {
     
// 업로드 중 리소스 소멸시 재연결합니다.
     
if(!isset($conn_id2
)) {
         
$conn_id2 ftp_connect($ftp_server
);
         
$login_result2 ftp_login($conn_id2$ftp_user_name$ftp_user_pass
);
      }
        
      
// 전송된 파일 크기를 측정합니다.
      
if(isset($conn_id2
)) {
          
clearstatcache
();
          
$remote_file_size ftp_size($conn_id2$remote_file
);
      }

      
// 프로그레스
      
$local_file_size  filesize($local_file
);
      if (isset(
$remote_file_size) && $remote_file_size 
){
          
$i = ($remote_file_size/$local_file_size)*100
;
          
printf("%d%% uploaded<br />\n"$i
);
          
flush
();
      }  
       
$ret ftp_nb_continue($conn_id
);
 }

 if (
$ret != FTP_FINISHED
) {
     print(
"There was an error uploading the file...<br />\n"
);
     exit(
1
);
 }
 else {
     print(
"ok!<br />\n"
);
 }

 
ftp_close($conn_id
); 

 
fclose($fp
);
 
?> 

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

php ftp에는 다양한 기능을 제공합니다. 그중 서버로 전송된 데이터를 다른 서버, 혹은 호스팅을 사용중이라도 ftp기능을 지원한다면, 두 서버간에 데이터 공유가 가능합니다. 다시 말해 웹사이트는 A 호스트로 운영을 하고, 데이터(파일 서버)는 B 호스트에 보관하는데, 사용자 요청시만 A 호스트로 업로드하거나 다운로드합니다.

가능하다면 골드회원은 C 호스트 파일다운로드권한을 주고, 실버회원은 B 호스트 파일다운로드권한 부여를 해서 파일 관리도 가능할 지도 모릅니다.

다음은 사용자가 업로드한 파일을 B 호스트로 원격 업로드합니다.

예재(ex #1

 <?php 
 
// ftp는 상대경로, 절대경로가 허용되지 않으며,
 // 보통 public_html, www, html 로 시작합니다.
 // public_html/userid 에 자료를 저장한다면,
 // ftp 경로는 "public_html/userid/파일" 이 됩니다.

 // 디비에 저장될 파일 이름 
 
$filename $_FILES['userfile']['name'
];
 
// B 호스트에 저장될 실제 파일
 
$tmpfile md5("habony_" $_FILES['userfile']['tmp_name'
]); 
 
$fp fopen($tmpfile'r'
); 

 
// B 호스트 정보
 
$ftp_server "호스트 혹은 ip주소"

 
$ftp_user_name "접속 아이디"

 
$ftp_user_pass "접속 패스워드"


 
// B 호스트 접속
 
$conn_id ftp_connect($ftp_server
); 

 
// B 호스트 로그인 
 
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass
); 

 
// 업로드 파일을 원격으로 B 호스트로 이동
 // B 호스트에 저장되면 DB 에 파일정보를 업데이트해줌
 // ftp_put 은 로컬에서만 가능하므로 ftp_fput을 사용합니다.
 
if (ftp_fput($conn_id$tmpfile$fpFTP_BINARY
)) { 
    echo 
"Successfully uploaded $filename\n"
;
 } else { 
    echo 
"There was a problem while uploading $file\n"

 } 

 
ftp_close($conn_id
); 
 
fclose($fp
); 
 
?>


필요시 업로드한 파일을 A 호스트로 가져 오는데, 이는 사용자가 파일 다운로드요청이나 이미지출력요청을 하였을 때만 처리되는 부분입니다.

예제(ex #2

 <?php 
 
// ftp는 상대경로, 절대경로가 허용되지 않으며,
 // 보통 public_html, www, html 로 시작합니다.
 // public_html/userid 에 자료를 저장한다면,
 // ftp 경로는 "public_html/userid/파일" 이 됩니다.

 // B 호스트에서 가져올 실제 파일
 
$remote_file "가져올 파일"
;
 
// A 호스트로 저장하거나 브라우저로 출력해야 할 파일
 
$local_file "저장할 파일"
;

 
// 임시 파일을 엽니다.
 
$fp fopen($local_file'w+'
);

  
// B 호스트 정보
 
$ftp_server "호스트 혹은 ip주소"

 
$ftp_user_name "접속 아이디"

 
$ftp_user_pass "접속 패스워드"


 
// B 호스트 접속
 
$conn_id ftp_connect($ftp_server
); 

 
// B 호스트 로그인 
 
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass
);

 
// 파일을 A 호스트로 업로드하고, 
 // $file 로 다운로드하거나 저장할 코드를 작성하면 됩니다.
 // ftp_get 은 로컬에서만 가능하므로 ftp_fget을 사용합니다.
 
if (ftp_fget($conn_id$fp$remote_fileFTP_BINARY0
)) { 
    while(!
feof($fp
)){ 
         
$file .= fread($fp1024
); 
    }
    
// 파일 다운로드나 파일 출력 처리 부분입니다.
    
echo "Successfully written to $local_file\n"

 } else { 
    echo 
"There was a problem while downloading $remote_file 
            to $local_file\n"

 } 

 
ftp_close($conn_id
); 
 
fclose($fp
); 
 
?> 


사용자가 자료 삭제 요청하였을 때, B 호스트 파일 삭제 처리 부분입니다.

예제(ex #3

<?php
 
// ftp는 상대경로, 절대경로가 허용되지 않으며,
 // 보통 public_html, www, html 로 시작합니다.
 // public_html/userid 에 자료를 저장한다면,
 // ftp 경로는 "public_html/userid/파일" 이 됩니다.
 
$file 'public_html/test.php'
;

   
// B 호스트 정보
 
$ftp_server "호스트 혹은 ip주소"

 
$ftp_user_name "접속 아이디"

 
$ftp_user_pass "접속 패스워드"


 
// B 호스트 접속
 
$conn_id ftp_connect($ftp_server
); 

 
// B 호스트 로그인 
 
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass
);

 
// B 호스트 파일 삭제
 // 파일 삭제가 정상적이면 DB 에 저장된 데이터도
 // 삭제 되도록 코드를 작성하면 됩니다.
 
if (ftp_delete($conn_id$file
)) {
      echo 
"$file deleted successful\n"
;
 } else {
      echo 
"could not delete $file\n"
;
 }

 
ftp_close($conn_id
);
 
?> 


이러한 기능은 서버일 경우 문제되지 않으나 호스팅을 받는 입장이라면 제한이 될 수 있습니다. 그래서 다음 코드로 ftp 지원여부 확인이 가능합니다.

 <?php
 
if(!function_exists('ftp_login'
)){
      echo 
"ftp 지원이 안됩니다."
;
 }
 
?>

 

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

  • rootman 2019.04.05 21:36  댓글주소  수정/삭제  댓글쓰기

    글 읽고서 궁금한게 있어서 남깁니다.
    CI 프레임워크 사용중이고 php입니다.
    저 소스 적용하는 곳이 정확히 어느 곳인지 알 수 있을까요?

    • Favicon of https://blog.habonyphp.com BlogIcon 하보니 2019.04.08 11:42 신고  댓글주소  수정/삭제

      CodeIgniter 를 말씀하시는 것 같은데, 죄송하지만 CodeIgniter 는 잘 모릅니다.
      다만...
      일반적인 방법으로 설명드리자면...
      위 소스가 proc.php 로 저장되어 있다면...

      <form enctype="multipart/form-data" action="proc.php" method="post">
      <input type="file" name="userfile">
      <input type="submit" value="전송">
      </form>

      정도가 되지 않을까 싶습니다.

int ftell ( resource $handle ) (PHP 4, PHP 5)

이 함수는 인자로 전달받은 파일 포인터가 가리키는 위치를 반환하는데, 성공하면 바이트 수로 계산된 정수를, 실패하면 false를 반환합니다.

예제 (ex #1

 <?php
 
/*
 test.txt파일 내용
 1. 안녕하세요. 하보니입니다.
 2. rewind함수 테스트입니다.
 3. 1234567890
 4. abcdefghijklmnopqrstuq
 5. asdfghjkl
 6. qwertyuiop
 7. qwertyuiop.BMP
 */

 
if($fp = @fopen("test.txt""r"
)){
      echo 
"현제 파일포인터 위치: " ftell($fp) . "<br />\n"
;
      
// 결과: 현제 파일포인터 위치: 0

      
echo fgets($fp1024) . "<br />\n"
;
      
// 결과: 1. 안녕하세요. 하보니입니다.

      
echo "현제 파일포인터 위치: " ftell($fp) . "<br />\n"
;
      
// 결과: 현제 파일포인터 위치: 30

      
echo fgets($fp1024) . "<br />\n"
;
      
// 결과: 2. rewind함수 테스트입니다.

      
echo "현제 파일포인터 위치: " ftell($fp) . "<br />\n"
;
      
// 결과: 현제 파일포인터 위치: 59

      
echo fgets($fp1024) . "<br />\n"
;
      
// 결과: 3. 1234567890

     
fclose($fp
);
 }
 
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag fopen

댓글을 달아 주세요

php.ini에서 allow_url_fopen 을 On으로 활성화하면 HTTP나 FTP를 통해 파일을 작성하거나 읽어올 수 있습니다. HTTP인 경우 include, include_once, require, require_once를 사용할 수 있고, FTP는 fopen 으로 접속가능합니다.

FTP 접속은 "ftp://아이디:패스워드@도메인" 으로 접속가능하나 동일 파일이 이미 존재하면 fopen함수 호출에 실패한다는 점에 주의해야 합니다.

예제 (ex #1
  <?php
 
// (ex #1
 
if($file = @fopen (
   
"ftp://user_id:user_passwd@example.com/public_html/test.php""w"
)){
      
// 여기에서 데이터를 씁니다.
      
fwrite ($file"원격 파일 쓰기<br />\n"
);
      
fclose ($file
);
 } else {
    echo 
"<p>원격 파일을 쓰도록 열 수 없습니다.\n"
;
    exit;
 }
 
// 결과: 원격 파일 쓰기<br />\n


 // 이미 (ex #1 에서 test.php파일을 작성하였으므로 (ex #2 는 원격파일 작성에 실패합니다.
 // (ex #2
 
if($file = @fopen (
   
"ftp://user_id:user_passwd@example.com/public_html/test.php""w"
)){
      
// 여기에서 데이터를 씁니다.
      
fwrite ($file"원격 파일 쓰기<br />\n"
);
      
fclose ($file
);
 } else {
    echo 
"<p>원격 파일을 쓰도록 열 수 없습니다.\n"
;
    exit;
 }

 
/*
 결과:
 Warning: fopen(ftp://...@example.com/public_html/test.php
[function.fopen]: failed to open stream: Remote file already exists
 and overwrite context option not specified
 <br /> FTP server reports  213 49 in C:\Server\public_html\test.php 
on line 4
 */
 
?>

원격 접속시 동일 파일이 존재하면 덮어 쓰기는 되지 않지만 데이터 추가는 가능합니다.

예제 (ex #2
 <?php
  
if($file = @fopen (
   
ftp://user_id:user_passwd@example.com/public_html/test.php
    "a"
)){
      
// 여기에서 데이터를 씁니다.
      
fwrite ($file"원격 파일 쓰기<br />\n"
);
      
fclose ($file
);
 } else {
    echo 
"<p>원격 파일을 쓰도록 열 수 없습니다.\n"
;
    exit;
 }

 
// 결과: 원격 파일 쓰기<br />\n원격 파일 쓰기<br />\n

 
?>

원격 접속시 읽어 오기도 가능합니다.

예제 (ex #3

 <?php
  
if($file = @fopen (
   
ftp://user_id:user_passwd@example.com/public_html/test.php,
     
"r"
)){
      
// 여기에서 데이터를 읽어 옵니다.
      
while(!feof($fp
)){
           
$file .= fread($fp,1024
);
      }
      
fclose ($fp
);
 } else {
    echo 
"<p>원격 파일을 열 수 없습니다.\n"
;
    exit;
 }

 echo 
$file
;

 
// 결과: 원격 파일 쓰기<br />\n원격 파일 쓰기<br />\n

 
?>


간단하게 원격파일 접속에 대해 설명은 되었지만, allow_url_fopen 를 활성화하는 것을 권하지는 않습니다.
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

int fseek ( resource $handle , int $offset [, int $whence ] ) (PHP 4, PHP 5)

이 함수는 두 번째 인자와 세 번째 인자에 의해 결정되는 새로운 위치로 이동 시킵니다. offset인자는 파일의 처음위치부터 byte수로 계산되는 값입니다. 성공시 "0"을, 실패시 "-1"를 반환하며, 세번째 인자는 다음 표와 같은 상수를 사용합니다.

 SEEK_SET 파일 포인터 첫 위치에서 offset 바이트만큼 위치로 이동합니다.
 SEEK_CUR 현제 파일 포인터의 위치에서 offset 바이트만큼 위치로 이동합니다.
 SEEK_END 파일 포인터 마지막 위치에서 offset 바이트만큼 위치로 이동합니다.

SEEK_END상수는 마지막위치에서 offset만큼 바이트수로 계산되기 때문에 음수를 지정하며, 세 번째 인자를 생략할 경우 SEEK_SET로 간주하여 실행하게 됩니다.

예제 (ex #1

 <?php
 
/*
 test.txt파일 내용
 1. 안녕하세요. 하보니입니다.
 2. rewind함수 테스트입니다.
 3. 1234567890
 4. abcdefghijklmnopqrstuq
 5. asdfghjkl
 6. qwertyuiop
 7. qwertyuiop.BMP
 */

 
$file 'test.txt'
;
 if(
$fp fopen($file,'r'
)){
    if(
is_resource($fp
)){

        
// 1024는 한줄을 읽어 오게 해줍니다.
        
if($fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
);
        }

        
// 포인터 처음 위치에서 offset 2만큼 이동후 출력합니다.
        
fseek($fp,2
);
        if(
$fname fgets($fp,1024
)){
            echo 
$fname ."<br />\n"
);
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }

        
// 포인터 처음 위치에서 offset 3만큼 이동후 출력합니다.
        // 포인터 첫 위치부터 다시 출력합니다.
        
fseek($fp,3,SEEK_SET
);
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }

        
// 현제 포인터 위치에서 offset 3만큼 이동후 출력합니다.
        
fseek($fp,3,SEEK_CUR
);
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        } 
    } 
// end is_resource
    
fclose($fp
);
 } 
// end fp

 /* 결과:
 1. 안녕하세요. 하보니입니다. 
 안녕하세요. 하보니입니다.
 2. rewind함수 테스트입니다. 
 3. 1234567890 
 4. abcdefghijklmnopqrstuq 
 안녕하세요. 하보니입니다.
 2. rewind함수 테스트입니다. 
 3. 1234567890 
 4. abcdefghijklmnopqrstuq 
 asdfghjkl
 6. qwertyuiop 
 */
 
?>


SEEK_END상수를 사용한 예입니다.

예제 (ex #2

  <?php
 
/*
 test.txt파일 내용
 1. 안녕하세요. 하보니입니다.
 2. rewind함수 테스트입니다.
 3. 1234567890
 4. abcdefghijklmnopqrstuq
 5. asdfghjkl
 6. qwertyuiop
 7. qwertyuiop.BMP
 */

 
$file 'test.txt'
;
 if(
$fp fopen($file,'r'
)){
    if(
is_resource($fp
)){

        
// 1024는 한줄을 읽어 오게 해줍니다.
        
if($fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
);
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
);
        }

        
// 끝에서 3문자만 출력합니다.
        
fseek($fp,-3,SEEK_END
);
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
    } 
// end is_resource
    
fclose($fp
);
 } 
// end fp
 
 /* 결과:
 1. 안녕하세요. 하보니입니다. 
 2. rewind함수 테스트입니다. 
 BMP
 */
 
?>


예제 (ex #3

<?php
 
/*
 test.txt파일 내용
 1. 안녕하세요. 하보니입니다.
 2. rewind함수 테스트입니다.
 3. 1234567890
 4. abcdefghijklmnopqrstuq
 5. asdfghjkl
 6. qwertyuiop
 7. qwertyuiop.BMP
 */

 
$file 'test.txt'
;
 if(
$fp fopen($file,'r'
)){
    if(
is_resource($fp
)){

        
// 1024는 한줄을 읽어 오게 해줍니다.
        
if($fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
);
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
);
        }

        
// 끝에서 10문자만 출력합니다.
        
fseek($fp,-10,SEEK_END
);
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }

        
// 포인터 처음 위치에서 offset 3만큼 이동후 출력합니다.
        // 포인터 첫 위치부터 다시 출력합니다.
        
fseek($fp,3,SEEK_SET
);
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }  
    } 
// end is_resource
    
fclose($fp
);
 } 
// end fp
 
 /* 결과:
 1. 안녕하세요. 하보니입니다. 
 2. rewind함수 테스트입니다. 
 tyuiop.BMP
 안녕하세요. 하보니입니다. 
 2. rewind함수 테스트입니다. 
 3. 1234567890 
 4. abcdefghijklmnopqrstuq 
 5. asdfghjkl 
 6. qwertyuiop
 */
 
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag fopen

댓글을 달아 주세요

bool rewind ( resource $handle ) (PHP 4, PHP 5)

fgets함수는 파일내 내용을 지정 크기만큼 읽어 들여 순서대로 출력하는데, 이를 처음 상태로 되돌리는 함수가 rewind입니다. rewinddir함수와 동일한 기능을 합니다.

예제 (ex #1

  <?php
 
/*
 test.txt 파일내용
 1. 안녕하세요. 하보니입니다.
 2. rewind함수 테스트입니다.
 3. 1234567890
 4. abcdefghijklmnopqrstuq
 5. asdfghjkl
 6. qwertyuiop
 */

 
$file 'test.txt'
;
 if(
$fp fopen($file,'r'
)){
    if(
is_resource($fp
)){

        
// 1024는 한 줄을 읽어 오게 해줍니다.
        
if($fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }

        
// 포지션을 처음 상태로 되돌립니다.
        
rewind($fp
);
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }    
    } 
// end is_resource
    
fclose($fp
);
 } 
// end fp

 /*
 결과:
 1. 안녕하세요. 하보니입니다. 
 2. rewind함수 테스트입니다. 
 3. 1234567890 
 4. abcdefghijklmnopqrstuq 
 5. asdfghjkl 
 6. qwertyuiop 
 1. 안녕하세요. 하보니입니다. 
 2. rewind함수 테스트입니다. 
 */
 
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag fopen

댓글을 달아 주세요

resource fopen ( string $filename , string $mode [, bool $use_include_path= false [, resource $context ]] ) (PHP 4, PHP 5)

이 함수는 호스트의 파일을 열거나 새로 만듭니다.
첫 번째 인자는 파일명 또는 절대경로를 입력하고, 두 번째 인자는 다음 표의 모드를 사용할 수 있습니다.

  모 드       의 미
 r 읽기 전용으로 오픈합니다.
 r+ 읽기와 쓰기 모드로 오픈합니다.
 w 쓰기 전용으로 오픈합니다. 기존 파일 내용은 완전히 지워지고, 새로 만듭니다. 파일이  존재하지 않는다면 새로 만듭니다.
 w+ 읽기와 쓰기 모드로 오픈합니다. 기존 파일 내용은 완전히 지워지고, 새로 만듭니다. 파일이  존재하지 않는다면 새로 만듭니다.
 a 내용 추가, 파일의 끝에 내용을 추가합니다. 파일이 존재하지 않는다면 새로 만듭니다.
 a+ 내용 추가와 읽기모드로 오픈하여 파일의 끝에 내용을 추가합니다. 파일이  존재하지 않는다면 새로 만듭니다.
 b 바이너리모드로 오픈합니다. 윈도우환경에서는 필수 모드

다음은 바이너리 그림 출력예제입니다.

예제 (ex #1
 <?php
 
// rb -> 읽기전용, 바이너리로 오픈합니다.
 
if($fp fopen('logo.gif''rb'
)){
     
// 바이너리로 읽기
     // 파일 포인터로 지정된 파일에서 최대 길이 1024*100 만큼 브라우저로 출력합니다.
      
print(fread($fp,1024*100
));
      
flush
();
      
// 파일을 오픈하면, 다른 스크립트에서  이용할 수 있도록 반드시 파일 포인터를 닫아야 합니다.
      
fclose($fp
);
 } else {
     print(
'파일을 찾을 수 없습니다.'
);
 }
 
?>

예제 (ex #2

 <?php
 $filename 
'test.bmp'
;

 
header("content-type: file/unknown"
);
 
header("content-length: ".filesize($filename
));
 
header("content-disposition: attachment; filename=\"${filename}\""
);
 
header("content-description: php generated data"
);
 
header("pragma: no-cache"
);
 
header("expires: 0"
);

 if(
$fp fopen($filename'rb'
)){
     while(!
feof($fp
)) {
          print(
fread($fp,1024
));
          
flush
();
     }
     
fclose($fp
);
 } else {
     print(
'파일을 찾을 수 없습니다.'
);
 }
 
?>


fpassthru함수는 처음 파일 포인터에서 끝까지의 파일 내용을 읽어 표준 출력으로 보냅니다.

예제 (ex #3
 <?php
 
// 읽기전용으로 오픈합니다.
 
if($fp fopen('readme.txt''rb'
)){
       
fpassthru($fp
);
       
flush
();
       
fclose($fp
);
 } else {
     print(
'파일을 찾을 수 없습니다.'
);
 }
 
?>


관련글: 2013/06/07 - [phP 함수 레퍼런스/파일 시스템 함수] - fopen 함수의 b flag 문제


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

bool feof ( resource $handle ) (PHP 4, PHP 5)

파일 포인터를 읽어 들인 위치가 끝인지 아닌지를 알기 위해 우선 파일을 "오픈"하고, "테스트"하고, "닫기"순으로 작성하면 됩니다. 해당 파일의 포인터가 끝이면 true를, 아니면 false를 반환합니다.

예제 (ex #1

 <?php
 
if(filetype('test.php') === 'file'
){
      
$fp fopen("test.php""rb"); 
// 오픈하기 (r은 읽기전용, b는 바이러니로 오픈하기)
      
while(!feof($fp)) { 
// 포인터의 위치가 끝이 아니면 실행
         
print fread($fp1024); 
// 한줄씩 읽어 옵니다.
         
flush
();
      }
      
fclose ($fp); 
// 닫기
 
}
 
clearstatcache
();
 
?>


다음은 파일 다운로드 예제입니다.

예제 (ex #2

 <?php
 $filename 
'test.php'
;

 
header("Cache-control: private"
);
 
header("Content-type: ".user_mime_content_type($filename
));
 
header("Content-Disposition: attachment; filename=".$filename
);
 
header("Content-Length: ".filesize($filename
));
 
header("Cache-Control: cache, must-revalidate"
);
 
header("Content-Description: PHP3 Generated Data"
);
 
header("Pragma: no-cache"
);
 
header("Expires: 0"
);

 if(
filetype('test.php') === 'file'
){
      
$fp fopen("test.php""rb"); 
// 오픈하기
      
while(!feof($fp
)) { 
         print 
fread($fp1024); 
// 한줄씩 읽어 옵니다.
         
flush
();
      }
      
fclose ($fp); 
// 닫기
 
} else {
    
header_remove(); 
// 파일이 아니면 전송 헤더목록을 삭제합니다.
 
}
 
clearstatcache
();
 
?>


user_mime_content_type함수는 [phP 함수 레퍼런스/파일 함수] - mime_content_type 함수를 참조해 주세요.
블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag fopen

댓글을 달아 주세요

void clearstatcache ([ bool $clear_realpath_cache= false [, string $filename ]] )
(PHP 4, PHP 5)

아래 표의 함수를 실행하면 같은 파일 이름을 사용할 경우를 위해 캐시로 임시 저장하여 메모리의 일정 부분 자원으로 할당하게 합니다. 이 일은 꽤많은 자원을 소모하는 일이기도 합니다. 시스템 자원 소모를 줄이기 위해 메모리에서 강제적으로 삭제하여 자원을 확보하거나 새로운 변경값으로 적용해 주는 기능이 clearstatcache 함수입니다.

     목 록
 stat
 lstat
 file_exists
 is_writable
 is_readable
 is_executable
 is_file
 is_dir
 is_link
 filectime
 fileatime
 filemtime
 fileinode
 filegroup
 fileowner
 filesize
 filetype
 fileperms

아래는 clearstatcache 함수를 호출하지 않았을 때의 결과입니다.

예제 (ex #1

 <?php
 $size1 
filesize('test.txt'
);

 echo 
"${size1}<br/>"
// 결과: 399

 
$fp fopen('test.txt','a'
);
 
fputs($fp,'clearstatcache 함수 테스트입니다.'
);
 
fclose($fp
);

 
$size2 filesize('test.txt'
);

 echo 
"${size2}<br/>"
// 결과: 399

 
$fp fopen('test.txt','a'
);
 
fputs($fp,'clearstatcache 함수 테스트입니다.'
);
 
fclose($fp
);

 
$size3 filesize('test.txt'
);

 echo 
"${size3}<br/>"
// 결과: 399
 
?>


test.txt 파일에 새로운 내용을 작성하면 파일의 사이즈가 커져야 하지만 결과는 그렇지 않습니다. 이는 최초에 캐시에 저장되어 있는 값을 그대로 가져오기 때문입니다. 그래서 clearstatcache 함수를 호출해서 캐시를 삭제하게 해줘야 원하는 값을 얻을 수 있습니다.

예제 (ex #2

 <?php
 $size1 
filesize('test.txt'
);
 
clearstatcache(); 
//  clearstatcache 함수로 캐시를 삭제합니다.

 
echo "${size1}<br/>"
// 결과: 399

 
$fp fopen('test.txt','a'
);
 
fputs($fp,'clearstatcache 함수 테스트입니다.'
);
 
fclose($fp
);

 
$size2 filesize('test.txt'
);
 
clearstatcache(); 
//  clearstatcache 함수로 캐시를 삭제합니다.

 
echo "${size2}<br/>"
// 결과: 405

 
$fp fopen('test.txt','a'
);
 
fputs($fp,'clearstatcache 함수 테스트입니다.'
);
 
fclose($fp
);

 
$size3 filesize('test.txt'
);
 
clearstatcache(); 
//  clearstatcache 함수로 캐시를 삭제합니다.

 
echo "${size3}<br/>"
// 결과: 411
 
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag fopen

댓글을 달아 주세요