fopen 함수

(PHP 4, PHP 5, PHP 7, PHP 8)

fopen — 파일 또는 URL을 엽니다.


설명

fopen(
    string $filename,
    string $mode,
    bool $use_include_path = false,
    ?resource $context = null
): resource|false
                

fopen()filename으로 지정된 명명된 리소스를 스트림에 바인딩합니다.


매개변수

filename
파일 이름이 "scheme://..." 형식이면 URL로 간주되고 PHP는 해당 체계에 대한 프로토콜 처리기(래퍼라고도 함)를 검색합니다. 해당 프로토콜에 대한 래퍼가 등록되지 않은 경우 PHP는 스크립트의 잠재적인 문제를 추적하는 데 도움이 되는 알림을 보낸 다음 filename이 일반 파일을 지정하는 것처럼 계속합니다.

PHP가 filename이 로컬 파일을 지정한다고 결정한 경우 해당 파일에서 스트림을 열려고 시도합니다. 파일은 PHP에 액세스할 수 있어야 하므로 파일 액세스 권한이 이 액세스를 허용하는지 확인해야 합니다. open_basedir를 활성화한 경우 추가 제한 사항이 적용될 수 있습니다.

PHP가 filename이 등록된 프로토콜을 지정하고 해당 프로토콜이 네트워크 URL로 등록되어 있다고 결정했다면 PHP는 allow_url_fopen이 활성화되었는지 확인합니다. 꺼져 있으면 PHP는 경고를 내보내고 fopen 호출은 실패합니다.

메모: 지원되는 프로토콜 목록은 지원되는 프로토콜 및 래퍼에서 찾을 수 있습니다. 일부 프로토콜(래퍼라고도 함)은 컨텍스트 및/또는 php.ini 옵션을 지원합니다. 설정할 수 있는 옵션 목록은 사용 중인 프로토콜의 특정 페이지를 참조하십시오. (예: http 래퍼에서 사용하는 php.ini 값 user_agent).

Windows 플랫폼에서 파일 경로에 사용된 백슬래시를 이스케이프 처리하거나 슬래시를 사용하지 않도록 주의하십시오.

                      
<?php
$handle = fopen("c:\\folder\\resource.txt", "r");
?>
                      
                    
mode
mode 매개변수는 스트림에 필요한 액세스 유형을 지정합니다. 다음 중 하나일 수 있습니다.

mode를 사용하는 fopen()의 가능한 모드 목록

mode 설명
'r' 읽기 전용으로 엽니다. 파일 시작 부분에 파일 포인터를 놓습니다.
'r+' 읽기와 쓰기를 위해 열려 있습니다. 파일 시작 부분에 파일 포인터를 놓습니다.
'w' 쓰기만 가능합니다. 파일 포인터를 파일 시작 부분에 놓고 파일을 0 길이로 자릅니다. 파일이 존재하지 않으면 생성을 시도하십시오.
'w+' 읽기와 쓰기를 위해 열려 있습니다. 그렇지 않으면 'w'와 같은 동작을 합니다.
'a' 쓰기만 가능합니다. 파일 끝에 파일 포인터를 놓습니다. 파일이 존재하지 않으면 생성을 시도하십시오. 이 모드에서 fseek()는 아무 효과가 없으며 쓰기는 항상 추가됩니다.
'a+' 읽기와 쓰기를 위해 열려 있습니다. 파일 끝에 파일 포인터를 놓습니다. 파일이 존재하지 않으면 생성을 시도하십시오. 이 모드에서 fseek()는 읽기 위치에만 영향을 미치고 쓰기는 항상 추가됩니다.
'x' 쓰기 전용으로 만들고 엽니다. 파일 시작 부분에 파일 포인터를 놓습니다. 파일이 이미 존재하는 경우 fopen() 호출은 false를 반환하고 E_WARNING 수준의 오류를 생성하여 실패합니다. 파일이 존재하지 않으면 생성을 시도하십시오. 이것은 기본 open(2) 시스템 호출에 대해 O_EXCL|O_CREAT 플래그를 지정하는 것과 같습니다.
'x+' 읽고 쓰기 위해 만들고 엽니다. 그렇지 않으면 'x'와 같은 동작을 합니다.
'c' 쓰기 전용으로 파일을 엽니다. 파일이 없으면 생성됩니다. 존재하는 경우 잘리거나('w'와 반대) 이 함수에 대한 호출이 실패하지 않습니다('x'의 경우와 같이). 파일 포인터는 파일의 시작 부분에 위치합니다. 'w'를 사용하면 잠금이 획득되기 전에 파일이 잘릴 수 있으므로 파일 수정을 시도하기 전에 권고 잠금(flock() 참조)을 얻으려는 경우 유용할 수 있습니다(자르기를 원하는 경우 잠금이 요청된 후 ftruncate()를 사용할 수 있습니다.).
'c+' 읽고 쓰기 위해 파일을 엽니다. 그렇지 않으면 'c'와 같은 동작을 합니다.
'e' 열린 파일 설명자에 close-on-exec 플래그를 설정합니다. POSIX.1-2008 준수 시스템에서 컴파일된 PHP에서만 사용할 수 있습니다.

메모:

운영 체제 제품군마다 줄 끝 규칙이 다릅니다. 텍스트 파일을 작성하고 줄 바꿈을 삽입하려면 운영 체제에 맞는 줄 끝 문자를 사용해야 합니다. Unix 기반 시스템은 줄 끝 문자로 \n을 사용하고, Windows 기반 시스템은 줄 끝 문자로 \r\n을 사용하고, Macintosh 기반 시스템(Mac OS Classic)은 줄 끝 문자로 \r을 사용합니다.

파일을 작성할 때 잘못된 줄 끝 문자를 사용하면 해당 파일을 여는 다른 응용 프로그램이 "재미있게 보일" 수 있습니다.

Windows는 파일로 작업할 때 \n을 \r\n으로 투명하게 변환하는 텍스트 모드 변환 플래그('')를 제공합니다. 반대로 'b'를 사용하여 데이터를 변환하지 않는 바이너리 모드를 강제 실행할 수도 있습니다. 이 플래그를 사용하려면 mode 매개변수의 마지막 문자로 'b' 또는 't'를 지정하십시오.

기본 번역 모드는 'b'입니다. 일반 텍스트 파일로 작업하고 \n을 사용하여 스크립트에서 줄 끝을 구분하지만 이전 버전의 메모장과 같은 응용 프로그램에서 파일을 읽을 수 있을 것으로 예상하는 경우 't' 모드를 사용할 수 있습니다. 다른 모든 경우에는 'b'를 사용해야 합니다.

바이너리 파일로 작업할 때 't' 플래그를 지정하면 깨진 이미지 파일 및 \r\n 문자에 대한 이상한 문제를 포함하여 데이터에 이상한 문제가 발생할 수 있습니다.

메모: 이식성을 위해 올바른 줄 끝과 'b' 모드를 대신 사용하도록 't' 모드를 사용하거나 의존하는 코드를 다시 작성하는 것이 좋습니다.

참고: php://output, php://input, php://stdin, php://stdout, php://stderrphp://fd 스트림 래퍼에서는 mode가 무시됩니다.

use_include_path
선택적 세 번째 use_include_path 매개변수는 '1'로 설정하거나 include_path에서도 파일을 검색하려는 경우 true로 설정할 수 있습니다.
context
컨텍스트 스트림 리소스입니다.

반환 값

성공하면 파일 포인터 리소스를 반환하고 실패하면 false를 반환합니다.


오류/예외

실패 시 E_WARNING이 발생합니다.


변경 로그

버전 설명
7.0.16, 7.1.2 'e' 옵션이 추가되었습니다.

Examples

예제 #1 fopen() 예제

                  
<?php
$handle = fopen("/home/rasmus/file.txt", "r");
$handle = fopen("/home/rasmus/file.gif", "wb");
$handle = fopen("http://www.example.com/", "r");
$handle = fopen("ftp://user:password@example.com/somefile.txt", "w");
?>
                  
                

메모

경고: SSL을 사용할 때 Microsoft IIS는 close_notify 표시기를 보내지 않고 연결을 닫음으로써 프로토콜을 위반합니다. 데이터 끝에 도달하면 PHP는 이것을 "SSL: 치명적인 프로토콜 오류"로 보고합니다. 이 문제를 해결하려면 error_reporting 값을 경고가 포함되지 않은 수준으로 낮춰야 합니다. PHP는 https:// 래퍼를 사용하여 스트림을 열 때 버그가 있는 IIS 서버 소프트웨어를 감지할 수 있으며 경고를 표시하지 않습니다. fsockopen()을 사용하여 ssl:// socket을 만들 때 개발자는 이 경고를 감지하고 표시하지 않을 책임이 있습니다.

참고: 파일을 읽고 쓰는 데 문제가 있고 PHP의 서버 모듈 버전을 사용하는 경우 사용 중인 파일과 디렉토리가 서버 프로세스에 액세스할 수 있는지 확인하십시오.

참고: 이 함수는 filename이 디렉토리인 경우에도 성공할 수 있습니다. filename이 파일인지 디렉토리인지 확실하지 않은 경우 fopen()을 호출하기 전에 is_dir() 함수를 사용해야 할 수도 있습니다.


기타