반응형
Web Development · PHP 파일 입출력 함수
PHP file_get_contents() — 파일 전체 내용을 한 번에 읽는 함수
is_readable 체크 · URL도 읽기 · file()과 차이 · 오류 처리 완전 정리
시작 오늘 분석할 코드
file_get_contents()는 파일의 전체 내용을 하나의 문자열로 읽어오는 함수입니다. fopen/fread/fclose의 3단계 절차를 한 줄로 처리할 수 있어 가장 간단한 파일 읽기 방법입니다. 파일뿐 아니라 HTTP URL을 통해 웹 페이지 내용도 읽어올 수 있습니다.
<?php $filename = "test.txt"; if (is_readable($filename)) { // 파일이 존재하고 읽기 권한이 있을 때만 진행 $contents = file_get_contents($filename); // 파일 전체 내용을 문자열로 읽어옴 print $contents; } else { print $filename . "을 읽을 수 없습니다."; } ?>
실제 출력 미리보기
test.txt 내용이 있을 때
Hello, PHP!
이것은 test.txt의 내용입니다.
이것은 test.txt의 내용입니다.
파일이 없거나 읽기 불가일 때
test.txt을 읽을 수 없습니다.
용어 용어 정리
file_get_contents()파일(또는 URL)의 전체 내용을 문자열로 반환. 실패 시 false
is_readable()파일이 존재하고 읽기 권한이 있으면 true — 읽기 전 체크 함수
is_file()경로가 일반 파일인지 확인 (디렉토리는 false)
file_exists()파일·디렉토리 존재 여부 확인 (읽기 권한은 체크 안 함)
file()파일을 줄 단위로 배열로 읽음 — file_get_contents는 문자열 전체
fopen/fread저수준 파일 핸들 방식 — 부분 읽기, 큰 파일에 유리
URL 스트림http:// 또는 https:// URL도 인수로 사용 가능 (allow_url_fopen=On 필요)
반환값성공 시 파일 내용 문자열, 실패 시 false — 엄격 비교(===) 권장
1 is_readable() 체크 — 왜 먼저 확인하는가?
파일 없음·권한 부족 상황에서 경고 방지
file_get_contents()는 파일이 없거나 읽기 권한이 없으면 false를 반환하고 E_WARNING을 출력합니다. is_readable()로 먼저 확인하면 경고 메시지 없이 깔끔하게 오류를 처리할 수 있습니다.
// is_readable = 파일 존재 + 읽기 권한 동시 체크 if (is_readable('config.txt')) { $data = file_get_contents('config.txt'); } else { echo "설정 파일을 읽을 수 없습니다."; } // 또는 반환값으로 오류 처리 (@ 로 경고 억제) $data = @file_get_contents('config.txt'); if ($data === false) { echo "읽기 실패"; }
※ is_readable()은 파일 존재 여부와 읽기 권한을 동시에 확인합니다. file_exists()는 존재만 확인하므로 권한 체크가 빠져 있습니다.
2 URL로 웹 내용 읽기
HTTP URL도 인수로 사용 가능 — allow_url_fopen 설정 필요
file_get_contents()는 로컬 파일뿐 아니라 HTTP/HTTPS URL의 내용도 읽을 수 있습니다. 단, php.ini에서 allow_url_fopen = On 설정이 필요합니다.
// 웹 페이지 HTML 읽기 $html = file_get_contents('https://example.com/'); if ($html !== false) { echo mb_strlen($html) . "바이트 읽음"; } // JSON API 응답 읽기 $json = file_get_contents('https://api.example.com/data'); $data = json_decode($json, true);
⚠️ 외부 URL을 읽는 코드에 사용자 입력값을 그대로 넣으면 SSRF(서버 측 요청 위조) 공격에 취약해집니다. URL을 반드시 화이트리스트로 검증하세요.
3 file() vs file_get_contents() — 줄 배열 vs 전체 문자열
file() — 줄 배열
$lines = file('data.txt');
foreach($lines as $line){
echo trim($line);
}
각 줄이 배열 요소로
foreach($lines as $line){
echo trim($line);
}
각 줄이 배열 요소로
file_get_contents() — 전체 문자열
$text = file_get_contents('data.txt');
echo $text;
파일 전체가 하나의 문자열로
간단하고 빠름
echo $text;
파일 전체가 하나의 문자열로
간단하고 빠름
반응형
4 큰 파일 처리 — offset과 maxlen 인수
일부만 읽을 때는 3~5번째 인수 활용
// 전체 읽기 (기본) file_get_contents('bigfile.txt'); // 1000번째 바이트부터 500바이트만 읽기 file_get_contents('bigfile.txt', false, null, 1000, 500); // 인수: ($path, $use_include_path, $context, $offset, $length)
※ 수백 MB 이상의 대용량 파일을 file_get_contents()로 읽으면 메모리가 부족할 수 있습니다. 큰 파일은 fopen/fgets 루프로 줄 단위로 읽는 것이 안전합니다.
5 설정 파일 읽기 패턴 — JSON 설정 활용
// config.json 파일 읽어서 파싱 if (is_readable('config.json')) { $json = file_get_contents('config.json'); $config = json_decode($json, true); echo $config['db_host']; } else { die("설정 파일 없음"); }
6 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
| 파일 존재 확인 없이 읽기 | 파일 없으면 E_WARNING + false 반환 → 경고 메시지 노출 | is_readable() 또는 @ 연산자로 경고 처리 |
| false 반환을 ""(빈 문자열)로 오인 | if ($contents) {} — 파일이 빈 파일이면 false처럼 처리됨 | if ($contents !== false) {} 엄격 비교 사용 |
| 대용량 파일 전체 읽기 | 메모리 부족 (memory_limit 초과) | fgets/fread로 줄 단위 스트리밍 처리 |
| 상대 경로 혼동 | 다른 디렉토리에서 실행 시 경로 오류 | __DIR__·dirname(__FILE__)로 절대 경로 사용 |
| URL 읽기 시 allow_url_fopen 확인 안 함 | Warning: file_get_contents(): Unable to open URL | php.ini에서 allow_url_fopen = On 확인 |
핵심 한 줄 요약
file_get_contents($path)파일 전체를 문자열로 읽음 — 실패 시 false
is_readable 패턴if (is_readable($f)) { file_get_contents($f) } — 안전한 읽기
URL 읽기http:// 주소도 가능 — allow_url_fopen=On 필요, SSRF 주의
vs file()file()=줄 배열 / file_get_contents()=전체 문자열
대용량 주의수백 MB 파일은 fgets 루프로 스트리밍 처리 권장
Tags
#PHP #file_get_contents #파일읽기 #is_readable #URL읽기 #파일입출력 #PHP파일함수 #PHP함수 #PHP학습 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, file_get_contents, 파일읽기, is_readable, URL읽기, 파일입출력, file함수, PHP파일함수, PHP함수, PHP학습, 웹개발, 티스토리
반응형
'php' 카테고리의 다른 글
| PHP copy() — 파일 복사 · 백업 패턴 · rename과 차이 완전 정리 (0) | 2026.07.11 |
|---|---|
| PHP file_put_contents() — 파일 쓰기 · FILE_APPEND · LOCK_EX 완전 정리 (0) | 2026.07.11 |
| PHP date() — 타임스탬프를 날짜 문자열로 포맷 · 포맷 문자 표 완전 정리 (0) | 2026.07.11 |
| PHP mktime() — 특정 날짜의 타임스탬프 생성 · date 연계 · 날짜 계산 완전 정리 (0) | 2026.07.10 |
| PHP checkdate() — 날짜 유효성 검사 · 윤년 · 폼 입력 검증 완전 정리 (0) | 2026.07.10 |
왕진 블로그

댓글