FOPEN, 파일 읽고 쓰기, 첨부하기의 스펙과 예제
* PHP에서 파일을 읽는 fopen 기능에 대해서 알아보자.
* fopen 포맷
resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )
: 인자를 총 4개 받으며, 1, 2번째 인자는 필수고 3, 4번째 인자는 옵션이다.
* 첫번째 인자: string $filename
: 파일을 로드할 파일명으로, 앞에 "scheme://..."와 같은 프로토콜을 명시하는 경우 해당하는 프로토콜을 이용하는 URL로 판별하여 해당 scheme의 프로토콜 핸들러를 찾아서 파일에 접근하게 된다. 만약 프로토콜이 명시되지 않았다면 서버 로컬의 일반적인 파일로 판단하여 찾게 된다. 만약 로컬의 파일로 판단하게 되면, 파일내용을 stream으로 열게 된다. php.ini에 safe_mode나 open_basedir를 설정하게 되면 fopen에 기본적으로 적용하게 된다.
: 만약 첫번째 인자를 URL로 판단하게 된다면, PHP는 php.ini파일의 allow_url_fopen이 활성화 되었는지 보고, 만약 false로 설정되어있다면 경고와 함께 fopen은 실행되지 않을 것이다.
- 참고로 PHP에서 위의 URL로 판단하는 scheme의 핸들러가 있는 목록은 다음과 같다.
- file:// - 로컬 파일 시스템 접근
- http:// - http url
- ftp:// - ftp url
- php:// - 다양한 I/O stream
- zlib:// - 압축된 stream
- data:// - 데이터 (RFC 2397)
- glob:// - 패턴에 맞는 경로이름을 검색
- phar:// - PHP archive
- ssh2:// - Secure SHell 2
- rar:// - rar
- ogg:// - audio stream
- expect:// Process Interaction Streams
- 주의: 윈도우 플랫폼에서는 백슬래쉬는 2개를 사용해야한다.
<?php
$handle = fopen("c:\\folder\\resource.txt", "r");
?>
* 두번째 인자: string $mode
: 어떠한 모드로 파일을 열 것인지 설정하는 인자. 각 인자는 아래와 같다.
인자 | 모드 | 포인터 위치 | 파일이 존재 유무 |
r | 읽기 전용 | 파일의 시작 | 파일 내용 보존 |
r+ | 읽고 쓰기 | 파일의 시작 | 파일 내용 보존 |
w | 쓰기 전용 | 파일의 시작 | 파일 내용 삭제, 없으면 새로 생성 |
w+ | 읽고 쓰기 | 파일의 시작 | 파일 내용 삭제, 없으면 새로 생성 |
a | 쓰기 전용 | 파일의 끝 | 파일 내용 보존, 없으면 새로 생성 |
a+ | 읽고 쓰기 | 파일의 끝 | 파일 내용 보존, 없으면 새로 생성 |
x | 쓰기 전용 | 새로운 파일 생성 | 파일이 존재하면 false 리턴 그리고 에러 남 |
x+ | 읽고 쓰기 | 새로운 파일 생성 | 파일이 존재하면 false 리턴 그리고 에러 남 |
- 위의 모드 인자뒤에 마지막에 b나 t를 붙일 수 있다.
- b: 바이너리모드로 호출
- t: 텍스트 파일의 라인 변경 태그를 Unix에서는 \n를 사용하고, 맥에서는 \r만 사용하는데 윈도우에서는 \r\n를 사용하는데, 이러한 \n을 \r\n으로 변환해준다. 따라서 다른 시스템의 텍스트 파일을 윈도우 플랫폼에서 열 때 사용하면 좋다.
* 세번째 인자: bool $use_include_path = false
: 3번째 인자는 옵션으로 기본 값이 false로 설정되어있다. true나 1로 설정하게 되면, php.ini에 설정되어있는 include_path의 경로도 같이 검색을 하게 된다.
* 네번째 인자: resource $context
: 4번째 인자는 PHP 5.0이후에 추가되었으며, 파일 핸들러에서 다룰 컨텍스트를 지정해주는 인자이다. context 설정은 아래와 같이 사용될 수 있다.
<?php
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar\r\n"
)
);
$context = stream_context_create($opts);
/* Sends an http request to www.example.com
with additional headers shown above */
$fp = fopen('http://www.example.com', 'r', false, $context);
fpassthru($fp);
fclose($fp);
?>
* 파일 읽고 쓰는 함수들
: 파일을 읽고 쓰거나 특정 위치로 갈때에는 다음 함수들을 사용하면 된다.
string fgets ( resource $handle [, int $length ] ); //한 줄을 읽은, default 최대 length는 1024
string fread ( resource $handle , int $length ); // length 바이트를 읽음 (바이너리 모드일 때 사용)
int fwrite ( resource $handle , string $string [, int $length ] ); // 바이너리로 파일에 씀
int ftell ( resource $handle ); // 현재 핸들러의 위치를 리턴
int fseek ( resource $handle , int $offset [, int $whence = SEEK_SET ] ); //핸들러의 해당 위치로 이동
* 파일 닫기
: 파일을 다 쓰고 읽고 나면 최종적으로는 반드시 파일을 닫아줘야한다.
bool fclose ( resource $handle ); // 핸들러를 닫는다.
* 파일 읽고 쓰기 예제
<?PHP //일반적인 파일 읽기 사용 예 $file_handle = fopen("myFile.txt", "r"); while (!feof($file_handle)) { $line_of_text = fgets($file_handle); print $line_of_text . "
"; } fclose($file_handle); ?>
//기존의 파일 뒤에 첨부하여 쓰기
$fh = fopen("testFile.txt", 'a') or die("can't open file");
fwrite($fh, "New Stuff 1\n");
fwrite($fh, "New Stuff 2\n");
fclose($fh);
//파일 5글자 읽기
$fh = fopen("testFile.txt", 'r');
echo fread($fh, 5);
fclose($fh);
//한 라인 읽기
$fh = fopen("testFile.txt", 'r');
echo fgets($fh);
fclose($fh);
// 40번째 바이트로 간다음 240바이트를 읽어서 출력하기
$fh = fopen("testFile.txt", 'r');
fseek($file,40);
echo fread($file,240);
* 끝
출처: https://unikys.tistory.com/273 [All-round programmer]
'프로그래밍 > PHP' 카테고리의 다른 글
php 7.x 에서 mongodb 연결하기 (CentOS 8) (0) | 2020.05.13 |
---|---|
php 코드로 json 형태로 출력하기 (0) | 2019.10.30 |
차트 (chart) 사용하기 (0) | 2019.03.15 |
: Cannot modify header information - headers already sent by (0) | 2018.07.21 |
php 7 에서 문자열 치환하기 (0) | 2017.12.08 |