Руководство по PHP
Пред. |  | След.

# fopen

(PHP 3, PHP 4, PHP 5)

fopen -- Открывает файл или URL

## Описание

resource fopen ( string filename, string mode [, bool use_include_path [, resource zcontext]] )

fopen() закрепляет именованый ресурс, указанный в аргументе `filename`, за потоком. Если `filename` передан в форме "scheme://...", он считается URL'ом и PHP проведёт поиск обработчика протокола (также известного как "обвёртка") для этой схемы. Если ни одна обвёртка не закреплена за протоколом, PHP выдаст замечание чтобы помочь вам отследить потенциальную проблему в вашем скрипте и продолжит выполнение, будто `filename` указывает на обыкновенный файл.

Если PHP решил, что `filename` указывает на локальный файл, тогда он попытается открыть поток к этому файлу. Файл должен быть доступен PHP, так что вам следует убедиться, что права доступа на файл разрешают это. Если вы вкдючили безопасный режим или open_basedir, накладываются дальнейшие ограничения.

Если PHP решил, что `filename` указывает на зарегистрированный протокол и этот протокол зарегистрирован как сетевой URL, PHP проверит состояние директивы allow_url_fopen. Если она выключена, PHP выдаст предупреждение и вызов fopen закончится неудачей.

> Замечание: Список поддерживаемых протоколов доступен в разделе Прил. M. Некоторые протоколы (`обвёртки`) поддерживают `context` и/или опции `php.ini`. Обратитесь к соответствующей странице с описанием используемого протокола для получения списка опций, которые могут быть установлены. (например, значение `php.ini` `user_agent` используется обвёрткой `http`). Для получения описания параметров `contexts` и `zcontext`, обратитесь к разделу Ссылка CLVII, Stream Functions.

> Замечание: Поддержка контекста была добавлена в `PHP 5.0.0`.

> Замечание: Начиная с версии PHP 4.3.2, бинарный режим является режимом по умолчанию для всех платформ, которые различают бинарный и текстовый, режимы. Если у вас возникли проблемы после обновления, попробуйте использовать флаг `'t'` в качестве обходного пути до тех пор, пока вы не измените свои скрипты для достижения большей портируемости, как отмечено выше.

Параметр `mode` указывает тип доступа, который вы запрашиваете у потока. Он может быть одним из следующих:

Таблица 1. Список возможных режимов для fopen() используя `mode`

`mode` | Описание
--- | ---
`'r'` | Открывает файл только для чтения; помещает указатель в начало файла.
`'r+'` | Окрывает файл для чтения и записи; помещяет указатель в начало файла.
`'w'` | Открывает файл только для записи; помещает указатель в начало файла и обрезает файл до нулевой длинны. Если файл не существует - пробует его создать.
`'w+'` | Открывает файл для чтения и записи; помещает указатель в начало файла и обрезает файл до нулевой длинны. Если файл не существует - пробует его создать.
`'a'` | Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует - пытается его создать.
`'a+'` | Открывает файл для чтения и записи; помещает указатель в конец файла. Если файл не существует - пытается его создать.

`'x'`

Создаёт и открывает только для записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт `FALSE` и выдаст предупреждение уровня `E_WARNING`. Если файл не существует, попытается его создать. Это эквивалентно указанию флагов `O_EXCL|O_CREAT` для внутреннего системного вызова `open(2)`. Эта опция поддерживается начиная с версии PHP 4.3.2 и выше, и работает только для локальных файлов.

`'x+'`

Создаёт и открывает для чтения и записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт `FALSE` и выдаст предупреждение уровня `E_WARNING`. Если файл не существует, попытается его создать. Это эквивалентно указанию флагов `O_EXCL|O_CREAT` для внутреннего системного вызова `open(2)`. Эта опция поддерживается начиная с версии PHP 4.3.2 и выше, и работает только для локальных файлов.

> Замечание: Разные семейства операционных систем имеют разные соглашения относительно окончанийя строк. Когда вы пишете текст и хотите вставить разрыв строки, вы должны использовать правильный(-ые) символ(ы) для вашей операционной системы. Системы семейства Unix используют `\n` в качестве символа конца строки, системы семейства Windows используют `\r\n` в качестве символов окончания строки и системы семейства Macintosh используют `\r` в качестве символа конца строки.

> Если вы используете неверный символ конца строки при редактировании файлов, вы можете обнаружить, что при открытии эти файлы "смешно выглядят".

> Windows предлагает флаг режима текстовой трансляции (`'t'`), который автоматически переведёт `\n` во время работы с файлом. И наоборот - также вы можете использовать `'b'` чтобы принудительно включить бинарный (двоичный) режим, в котором ваши данные не будут преобразовываться. Чтобы использовать эти режимы, укажите `'b'` или `'t'` в качестве последней буквы параметра `mode`.

> Так как установка флага трансляции по умолчанию зависит от SAPI и версии PHP, которую вы используете, рекомендуем явно задавать указанный флаг из соображений портируемости. Вы должны использовать режим `'t'` если вы работаете с текстовым файлом и использовать `\n` для разделения для обозначения конца строки в вашем скрипте, при этом не беспокоясь за читаемость ваших файлов в других приложениях типа "Блокнота". В противном случае вам следует использовать флаг `'b'`.

> Если вы явно не укажете флаг 'b' во время работы с бинарными файлами, вы можете столкнуться со странной порчей ваших данных, включая испорченные файлы изображений и странные проблемы с символами `\r\n`.

> Замечание: Из соображений портируемости, настоятельно рекомендуется всегда использовать флаг 'b' при открытии файлов с помощью fopen().

> Замечание: Кроме того, из соображений портируемости, также настойчиво рекомендуется переписать старый код, который полагается на режим `'t'`, чтобы вместо этого он использовал правильные окончания строк и режим `'b'`.

Необязательный третий параметр `use_include_path` может быть установлен в '1' или `TRUE`, если вы также хотите провести поиск файла в include_path.

Если открыть файл не удалось, функция вернёт `FALSE` и сгенерирует ошибку уровня `E_WARNING`. Вы можете использовать @ для того, чтобы подавить это предупреждение.

Пример 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"); ?>`

Если вы сталкиваетесь с проблемами во время чтения или записи файлов, и вы используете PHP в виде серверного модуля, убедитесь в том, что процесс сервера имеет доступ к файлам и директориям, которые вы используете.

На платформе Windows, вам необходимо не забывать экранировать все обратные слеши в пути к файлу или использовать прямые слеши.

`<?php $handle = fopen("c:\\data\\info.txt", "r"); ?>`

Внимание

При использовании SSL, Microsoft IIS нарушает протокол, закрывая соединение без отправки индикатора close_notify. PHP сообщит об этом как о "SSL: Fatal Protocol Error" в тот момент, когда вы достигнете конца данных. Чтобы обойти это, вы должны установить error_reporting на уровень, исключающий E_WARNING. PHP версий 4.3.7 и старше умеет определять, что на стороне сервера находится проблемный IIS и не выводит предупреждение. Если вы используете fsockopen() для создания ssl:// сокета, вы сами отвечаете за определение и подавление этого предупреждения.

> Замечание: Когда опция safe mode включена, PHP проверяет, имеет ли каталог, с которым вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.

См. также раздел Прил. M, описание функций fclose(), fgets(), fread(), fwrite(), fsockopen(), file(), file_exists(), is_readable(), stream_set_timeout() и popen().

Пред. | Начало | След.
fnmatch | Уровень выше | fpassthru