fopen
(PHP 4, PHP 5, PHP 7)
fopen — Открывает файл или URL
Описание
$filename
, string $mode
, bool $use_include_path
= false
, resource $context
= ?
) : resource
fopen() закрепляет именованный ресурс, указанный
в аргументе filename
, за потоком.
Список параметров
-
filename
-
Если
filename
передан в форме "scheme://...", он считается URL'ом и PHP проведёт поиск обработчика протокола (также известного как "обертка") для этой схемы. Если ни одна обёртка не закреплена за протоколом, PHP выдаст замечание, чтобы помочь вам отследить потенциальную проблему в вашем скрипте и затем продолжит выполнение, как если быfilename
указывал на обыкновенный файл.Если PHP установлено, что
filename
указывает на локальный файл, тогда выполняется попытка открыть поток к этому файлу. Файл должен быть доступен PHP, так что вам следует убедиться, что права доступа на файл это разрешают. Если вы включили open_basedir, то накладываются дальнейшие ограничения.Если PHP установил, что
filename
указывает на зарегистрированный протокол и этот протокол зарегистрирован как сетевой URL, PHP выполняет проверку состояния директивы allow_url_fopen. Если она выключена, PHP выдаст предупреждение и вызов fopen закончится неудачей.Замечание:
Список поддерживаемых протоколов доступен в разделе Поддерживаемые протоколы и обертки. Некоторые протоколы (
обертки
) поддерживаютконтекст
и/или опции php.ini. Обратитесь к соответствующей странице с описанием используемого протокола для получения списка опций, которые могут быть установлены. (например, значение php.iniuser_agent
используется оберткойhttp
).На платформе Windows, необходимо экранировать все обратные слеши в пути к файлу или использовать прямые слеши.
<?php
$handle = fopen("c:\\folder\\resource.txt", "r");
?> -
mode
-
Параметр
mode
указывает тип доступа, который вы запрашиваете у потока. Он может быть одним из следующих вариантов:Список возможных режимов для fopen(), используя 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'
.'e'
Установить флаг close-on-exec (закрыть при запуске) на открытый файловый дескриптор. Доступно только в PHP скомпилированном на системах поддерживающих POSIX.1-2008. Замечание:
Разные семейства операционных систем имеют разные соглашения относительно окончания строк. Когда вы пишете текст и хотите вставить разрыв строки, вы должны использовать правильные символы (или символ) для вашей операционной системы. Системы семейства Unix используют
\n
в качестве символа конца строки, системы семейства Windows используют\r\n
в качестве символов окончания строки и системы семейства Macintosh (Mac OS Classic) используют\r
в качестве символа конца строки.Если вы используете неверный символ конца строки при редактировании файлов, вы можете обнаружить, что при открытии эти файлы "странно выглядят".
Windows предлагает флаг режима текстовой трансляции (
't'
), который автоматически переведёт\n
в\r\n
во время работы с файлом. И наоборот - вы также можете использовать'b'
, чтобы принудительно включить бинарный режим, в котором ваши данные не будут преобразовываться. Чтобы использовать эти режимы, укажите'b'
или't'
последней буквой параметраmode
.Флагом трансляции по умолчанию является
'b'
. Вы можете использовать режим't'
, если работаете с текстовыми файлами и используете\n
для обозначения конца строки в вашем скрипте, но при этом предполагаете, что ваши файлы будут использоваться в таких приложениях, как "Блокнот" (в устаревших версиях). Во всех остальных случаях используйте флаг'b'
.Если вы укажете флаг 't' во время работы с бинарными файлами, вы можете столкнуться со странными проблемами с вашими данными, включая поврежденные файлы изображений и проблемы с символами
\r\n
.Замечание:
Опять же из соображений портируемости крайне рекомендуется переписать старый код, который полагается на режим
't'
, чтобы вместо этого он использовал правильные концы строк и режим'b'
. -
use_include_path
-
Необязательный третий параметр
use_include_path
может быть установлен в '1' илиtrue
, если вы также хотите провести поиск файла в include_path. -
context
-
Замечание: Поддержка контекста была добавлена в PHP 5.0.0. Для описания
контекстов
смотрите раздел Потоки.
Возвращаемые значения
Возвращает указатель на файл в случае успешной работы,
или false
в случае возникновения ошибки
Ошибки
В случае неудачного завершения работы генерируется ошибка уровня E_WARNING
.
Список изменений
Версия | Описание |
---|---|
7.0.16, 7.1.2 |
Добавлена опция 'e' .
|
Примеры
Пример #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://
сокета, вы сами отвечаете за определение и подавление этого предупреждения.
Замечание:
Если вы сталкиваетесь с проблемами во время чтения или записи файлов, и вы используете PHP в виде серверного модуля, убедитесь в том, что процесс сервера имеет доступ к используемым вами файлам и директориям.
Замечание:
Данная функция также может принимать директории в качестве параметра
filename
. Если вы не знаете, является лиfilename
файлом или директорией, то вам может понадобиться использовать функцию is_dir() до вызова функции fopen().
Смотрите также
- Поддерживаемые протоколы и обертки
- fclose() - Закрывает открытый дескриптор файла
- fgets() - Читает строку из файла
- fread() - Бинарно-безопасное чтение файла
- fwrite() - Бинарно-безопасная запись в файл
- fsockopen() - Открывает соединение с интернет-сокетом или доменным сокетом Unix
- file() - Читает содержимое файла и помещает его в массив
- file_exists() - Проверяет существование указанного файла или каталога
- is_readable() - Определяет существование файла и доступен ли он для чтения
- stream_set_timeout() - Установить значение тайм-аута для потока
- popen() - Открывает файловый указатель процесса
- stream_context_create() - Создаёт контекст потока
- umask() - Изменяет текущую umask
- SplFileObject