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.iniuser_agent используется
обвёрткой http).
Для получения описания параметров contexts и
zcontext, обратитесь к разделу Ссылка CXLV, 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. Вы можете использовать
@ для того,
чтобы подавить это предупреждение.
Если вы сталкиваетесь с проблемами во время чтения или записи
файлов, и вы используете PHP в виде серверного модуля, убедитесь
в том, что процесс сервера имеет доступ к файлам и директориям,
которые вы используете.
На платформе Windows, вам необходимо не забывать экранировать все
обратные слеши в пути к файлу или использовать прямые слеши.
При использовании 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 (владельца),
как и выполняемый скрипт.