(PHP 4, PHP 5, PHP 7)
fopen — Открывает файл или URL
$filename
, string $mode
[, bool $use_include_path
= false
[, resource $context
]] )
fopen() закрепляет именованный ресурс, указанный
в аргументе filename
, за потоком.
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, необходимо экранировать все обратные слеши в пути к файлу или использовать прямые слеши.
<?php
$handle = fopen("c:\\folder\\resource.txt", "r");
?>
mode
Параметр mode
указывает тип доступа, который вы
запрашиваете у потока. Он может быть одним из следующих вариантов:
mode |
Описание |
---|---|
'r' | Открывает файл только для чтения; помещает указатель в начало файла. |
'r+' | Открывает файл для чтения и записи; помещает указатель в начало файла. |
'w' | Открывает файл только для записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует - пробует его создать. |
'w+' | Открывает файл для чтения и записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует - пытается его создать. |
'a' | Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует - пытается его создать. В данном режиме функция fseek() не применима, записи всегда добавляются. |
'a+' | Открывает файл для чтения и записи; помещает указатель в конец файла. Если файл не существует - пытается его создать. В данном режиме функция fseek() влияет только на место чтения, записи всегда добавляются. |
'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
Необязательный третий параметр use_include_path
может быть установлен в '1' или TRUE
, если вы также хотите провести
поиск файла в include_path.
context
Замечание: Поддержка контекста была добавлена в PHP 5.0.0. Для описания контекстов смотрите раздел Потоки.
Возвращает указатель на файл в случае успешной работы, или FALSE
в случае ошибки.
Если открыть файл не удалось, будет сгенерирована ошибка уровня
E_WARNING
. Вы можете использовать оператор @ для подавления этой ошибки.
Версия | Описание |
---|---|
5.2.6 | Добавлены опции 'c' и 'c+' |
4.3.2 | С версии PHP 4.3.2, по умолчанию устанавливается бинарный режим для всех платформ, различающих бинарный и текстовый режимы. Если у вас появились проблемы после обновления, попытайтесь использовать в качестве обхода проблемы флаг 't', пока вы не сделаете ваш скрипт более портируемым, как это было указано выше. |
Пример #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: Fatal Protocol Error" в тот момент, когда вы достигнете конца данных. Чтобы обойти это, вы должны установить error_reporting на уровень, исключающий E_WARNING. PHP умеет определять, что на стороне сервера находится проблемный IIS при открытии потока с помощью обертки https:// и не выводит предупреждение. Если вы используете fsockopen() для создания ssl:// сокета, вы сами отвечаете за определение и подавление этого предупреждения.
Замечание: Когда опция safe mode включена, PHP проверяет, имеет ли каталог, с которым вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
Замечание:
Если вы сталкиваетесь с проблемами во время чтения или записи файлов, и вы используете PHP в виде серверного модуля, убедитесь в том, что процесс сервера имеет доступ к используемым вами файлам и директориям.
Замечание:
Данная функция также может принимать директории в качестве параметра
filename
. Если нет уверенности в том, заданы ли в параметреfilename
файл или директория, то необходимо применить функцию is_dir() до вызова функции fopen().