PHP Open File
Summary: in this tutorial, you will learn how to open a file in PHP using the fopen() function.
Introduction to the PHP fopen() function
Before reading from or writing to a file, you need to open it. To open a file, you use the fopen() function as follows:
fopen ( string $filename , string $mode , bool $use_include_path = false , resource $context = ? ) : resource
Code language: PHP (php)
The fopen() has the following parameters:
- $filename is the path to the file that you want to open.
- $mode specifies the type of access you require to the stream. See the table below.
- $use_include_path determines whether the fopen() should also search for the file in the include path.
- $context specifies the stream context.
The fopen() returns the file pointer resource if it opens the file successfully or false if it fails to open the file.
The following table shows the type of access of the $mode parameter:
Mode | Reading | Writing | File Pointer | File doesn’t exist, Create? | If the File Exists |
---|---|---|---|---|---|
‘r’ | Yes | No | At the beginning of the file | No | |
‘r+’ | Yes | Yes | At the beginning of the file | No | |
‘w’ | No | Yes | At the beginning of the file | No | |
‘w+’ | Yes | Yes | At the beginning of the file | Yes | |
‘a’ | No | Yes | At the end of the file | Yes | |
‘a+’ | Yes | Yes | At the end of the file | Yes | |
‘x’ | No | Yes | At the beginning of the file | Yes | Return false |
‘x+’ | Yes | Yes | At the beginning of the file | Yes | Return false |
‘c’ | No | Yes | At the beginning of the file | Yes | |
‘c+’ | Yes | Yes | At the beginning of the file | Yes |
When working with a binary file, you need to append the characer b to the $mode argument. For example, the ‘rb’ mode opens a binary file for reading.
After opening a file and completing working with it, you should always close the file. If you don’t close a file properly, it may cause many issues. For example, you may not be able to access the file again.
To close a file, you pass the file pointer to the fclose() function:
fclose ( resource $stream ) : bool
Code language: PHP (php)
The fclose() function returns true on success or false on failure.
It’s a good practice to check if a file exists before opening it.
PHP open files example
The following example uses the fopen() to open the readme.txt file for reading:
$filename = 'readme.txt'; if (!file_exists($filename)) < die("The file $filename does not exist."); > $f = fopen($filename, 'r'); if ($f) < // process the file // . echo 'The file ' . $filename . ' is open'; fclose($f); >
Code language: HTML, XML (xml)
- First, use the file_exists() function to check if the readme.txt file exists. If not, throw an exception saying that the file doesn’t exist.
- Second, use the fopen() function to open the readme.txt for reading.
- Third, close the file in the finally block only if the file pointer is not null .
Summary
- Use the fopen() function to open a file for reading, writing, and appending.
- Always use the fclose() function to close the file that was open by the fopen() function.
fopen
fopen() закрепляет именованный ресурс, указанный в аргументе filename , за потоком.
Список параметров
Если filename передан в форме «scheme://. «, он считается URL’ом и PHP проведёт поиск обработчика протокола (также известного как «обертка») для этой схемы. Если ни одна обёртка не закреплена за протоколом, PHP выдаст замечание, чтобы помочь вам отследить потенциальную проблему в вашем скрипте и затем продолжит выполнение, как если бы filename указывал на обыкновенный файл.
Если PHP установлено, что filename указывает на локальный файл, тогда выполняется попытка открыть поток к этому файлу. Файл должен быть доступен PHP, так что вам следует убедиться, что права доступа на файл это разрешают. Если вы включили безопасный режим или open_basedir, то накладываются дальнейшие ограничения.
Если PHP установлено, что filename указывает на зарегистрированный протокол и этот протокол зарегистрирован как сетевой URL, PHP выполняет проверку состояния директивы allow_url_fopen. Если она выключена, PHP выдаст предупреждение и вызов fopen закончится неудачей.
Замечание:
Список поддерживаемых протоколов доступен в разделе Поддерживаемые протоколы и обработчики (wrappers). Некоторые протоколы (обертки) поддерживают контекст и/или опции php.ini . Обратитесь к соответствующей странице с описанием используемого протокола для получения списка опций, которые могут быть установлены. (например, значение php.ini user_agent используется оберткой http).
На платформе Windows, необходимо экранировать все обратные слеши в пути к файлу или использовать прямые слеши.
Параметр mode указывает тип доступа, который вы запрашиваете у потока. Он может быть одним из следующих вариантов:
mode | Описание |
---|---|
‘r’ | Открывает файл только для чтения; помещает указатель в начало файла. |
‘r+’ | Открывает файл для чтения и записи; помещает указатель в начало файла. |
‘w’ | Открывает файл только для записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует — пробует его создать. |
‘w+’ | Открывает файл для чтения и записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует — пытается его создать. |
‘a’ | Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует — пытается его создать. |
‘a+’ | Открывает файл для чтения и записи; помещает указатель в конец файла. Если файл не существует — пытается его создать. |
‘x’ | Создаёт и открывает только для записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт FALSE и выдаст ошибку уровня E_WARNING . Если файл не существует, попытается его создать. Это эквивалентно указанию флагов O_EXCL|O_CREAT для внутреннего системного вызова open(2). |
‘x+’ | Создаёт и открывает для чтения и записи; иначе имеет то же поведение что и‘x’. |
‘c’ | Открывает файл только для записи. Если файл не существует, то он создается. Если же файл существует, то он не обрезается (в отличии от ‘w’), и вызов к этой функции не вызывает ошибку (также как и в случае с ‘x’). Указатель на файл будет установлен на начало файла. Это может быть полезно при желании заблокировать файл (смотри flock() ) перед изменением, так как использование ‘w’ может обрезать файл еще до того как была получена блокировка (если вы желаете обрезать файл, можно использовать функцию ftruncate() после запроса на блокировку). |
‘c+’ | Открывает файл для чтения и записи; иначе имеет то же поведение, что и ‘c’. |
Замечание:
Разные семейства операционных систем имеют разные соглашения относительно окончания строк. Когда вы пишете текст и хотите вставить разрыв строки, вы должны использовать правильные символы (или символ) для вашей операционной системы. Системы семейства Unix используют \n в качестве символа конца строки, системы семейства Windows используют \r\n в качестве символов окончания строки и системы семейства Macintosh используют \r в качестве символа конца строки.
Если вы используете неверный символ конца строки при редактировании файлов, вы можете обнаружить, что при открытии эти файлы «странно выглядят».
Windows предлагает флаг режима текстовой трансляции (‘t’), который автоматически переведёт \n в \r\n во время работы с файлом. И наоборот — вы также можете использовать ‘b’, чтобы принудительно включить бинарный режим, в котором ваши данные не будут преобразовываться. Чтобы использовать эти режимы, укажите ‘b’ или ‘t’ последней буквой параметра mode .
Так как установка флага трансляции по умолчанию зависит от SAPI и используемой версии PHP, рекомендуем явно задавать указанный флаг из соображений портируемости. Вы должны использовать режим ‘t’, если вы работаете с текстовым файлом и использовать \n для обозначения конца строки в вашем скрипте, при этом не беспокоясь за читаемость ваших файлов в других приложениях типа «Блокнота». Во всех остальных случаях используйте флаг ‘b’.
Если вы явно не укажете флаг ‘b’ во время работы с бинарными файлами, вы можете столкнуться со странной порчей ваших данных, включая испорченные файлы изображений и странные проблемы с символами \r\n.
Замечание:
Из соображений портируемости, настоятельно рекомендуется всегда использовать флаг ‘b’ при открытии файлов с помощью fopen() .
Замечание:
Кроме того, из соображений портируемости, также настойчиво рекомендуется переписать старый код, который полагается на режим ‘t’, чтобы вместо этого он использовал правильные концы строк и режим ‘b’.
Необязательный третий параметр use_include_path может быть установлен в ‘1’ или TRUE , если вы также хотите провести поиск файла в include_path.
Замечание: Поддержка контекста была добавлена в PHP 5.0.0. Для описания контекстов смотрите раздел Потоки.
Возвращаемые значения
Возвращает указатель на файл в случае успешной работы, или FALSE в случае ошибки.
Ошибки
Если открыть файл не удалось, будет сгенерирована ошибка уровня E_WARNING . Вы можете использовать оператор @ для подавления этой ошибки.
Список изменений
Версия | Описание |
---|---|
5.2.6 | Добавлены опции ‘c’ и ‘c+’ |
4.3.2 | С версии PHP 4.3.2, по умолчанию устанавливается бинарный режим для всех платформ, различающих бинарный и текстовый режимы. Если у вас появились проблемы после обновления, попытайтесь использовать в качестве обхода проблемы флаг ‘t’, пока вы не сделаете ваш скрипт более портируемым, как это было указано выше. |
Примеры
Пример #1 Примеры использования fopen()
$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» );
?>?php
Примечания
При использовании SSL, Microsoft IIS нарушает протокол, закрывая соединение без отправки индикатора close_notify. PHP сообщит об этом как «SSL: Fatal Protocol Error» в тот момент, когда вы достигнете конца данных. Чтобы обойти это, вы должны установить error_reporting на уровень, исключающий E_WARNING. PHP версий 4.3.7 и старше умеет определять, что на стороне сервера находится проблемный IIS при открытии потока с помощью обертки https:// и не выводит предупреждение. Если вы используете fsockopen() для создания ssl:// сокета, вы сами отвечаете за определение и подавление этого предупреждения.
Замечание: Когда опция safe mode включена, PHP проверяет, имеет ли каталог, с которым вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
Замечание:
Если вы сталкиваетесь с проблемами во время чтения или записи файлов, и вы используете PHP в виде серверного модуля, убедитесь в том, что процесс сервера имеет доступ к используемым вами файлам и директориям.
Замечание:
Эта функция также может выполниться успешно, в случае если filename является директорией. Если вы не уверены является ли filename файлом или директорией, то вам необходимо воспользоваться функцией is_dir() , до вызова fopen() .
Смотрите также
- Поддерживаемые протоколы и обработчики (wrappers)
- fclose() — Закрывает открытый дескриптор файла
- fgets() — Читает строку из файла
- fread() — Бинарно-безопасное чтение файла
- fwrite() — Бинарно-безопасная запись в файл
- fsockopen() — Открывает соединение с интернет сокетом или доменным сокетом Unix
- file() — Читает содержимое файла и помещает его в массив
- file_exists() — Проверяет наличие указанного файла или каталога
- is_readable() — Определяет существование файла и доступен ли он для чтения
- stream_set_timeout() — Устанавливает значение тайм-аута на потоке
- popen() — Открывает файловый указатель процесса
- stream_context_create() — Создаёт контекст потока
- umask() — Изменяет текущую umask
- SplFileObject