Files
php-doc-ru/reference/filesystem/functions/fopen.xml
2021-12-23 13:02:26 +03:00

394 lines
19 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: ea62fb83196997032641b50fe44420305466195e Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="function.fopen">
<refnamediv>
<refname>fopen</refname>
<refpurpose>Открывает файл или URL</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type class="union"><type>resource</type><type>false</type></type><methodname>fopen</methodname>
<methodparam><type>string</type><parameter>filename</parameter></methodparam>
<methodparam><type>string</type><parameter>mode</parameter></methodparam>
<methodparam choice="opt"><type>bool</type><parameter>use_include_path</parameter><initializer>&false;</initializer></methodparam>
<methodparam choice="opt"><type class="union"><type>resource</type><type>null</type></type><parameter>context</parameter><initializer>&null;</initializer></methodparam>
</methodsynopsis>
<para>
<function>fopen</function> закрепляет именованный ресурс, указанный
в аргументе <parameter>filename</parameter>, за потоком.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>filename</parameter></term>
<listitem>
<para>
Если <parameter>filename</parameter> передан в форме "scheme://...",
он считается URL и PHP проведёт поиск обработчика протокола
(также известного как "обёртка") для этой схемы. Если ни одна
обёртка не закреплена за протоколом, PHP выдаст замечание,
чтобы помочь вам отследить потенциальную проблему в вашем
скрипте и затем продолжит выполнение, как если бы <parameter>filename</parameter>
указывал на обыкновенный файл.
</para>
<para>
Если PHP установлено, что <parameter>filename</parameter> указывает на
локальный файл, тогда выполняется попытка открыть поток к этому файлу.
Файл должен быть доступен PHP, так что вам следует убедиться,
что права доступа на файл это разрешают.
Если вы включили <link linkend="ini.open-basedir">open_basedir</link>, то накладываются
дальнейшие ограничения.
</para>
<para>
Если PHP установил, что <parameter>filename</parameter> указывает на
зарегистрированный протокол и этот протокол зарегистрирован как
сетевой URL, PHP выполняет проверку состояния директивы
<link linkend="ini.allow-url-fopen">allow_url_fopen</link>.
Если она выключена, PHP выдаст предупреждение и вызов fopen закончится
неудачей.
</para>
<note>
<para>
Список поддерживаемых протоколов доступен в разделе <xref linkend="wrappers"/>.
Некоторые протоколы (<literal>обёртки</literal>) поддерживают
<literal>контекст</literal> и/или опции &php.ini;.
Обратитесь к соответствующей странице с описанием используемого протокола
для получения списка опций, которые могут быть установлены.
(например, значение &php.ini; <literal>user_agent</literal> используется
обёрткой <literal>http</literal>).
</para>
</note>
<para>
На платформе Windows, необходимо экранировать все
обратные слеши в пути к файлу или использовать прямые слеши.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$handle = fopen("c:\\folder\\resource.txt", "r");
?>
]]>
</programlisting>
</informalexample>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>mode</parameter></term>
<listitem>
<para>
Параметр <parameter>mode</parameter> указывает тип доступа, который вы
запрашиваете у потока. Он может быть одним из следующих вариантов:
<table>
<title>
Список возможных режимов для <function>fopen</function>,
используя <parameter>mode</parameter>
</title>
<tgroup cols="2">
<thead>
<row>
<entry><parameter>mode</parameter></entry>
<entry>Описание</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>'r'</literal></entry>
<entry>
Открывает файл только для чтения; помещает указатель
в начало файла.
</entry>
</row>
<row>
<entry><literal>'r+'</literal></entry>
<entry>
Открывает файл для чтения и записи; помещает указатель
в начало файла.
</entry>
</row>
<row>
<entry><literal>'w'</literal></entry>
<entry>
Открывает файл только для записи; в противном случае ведёт
себя так же, как и <literal>'w+'</literal>.
</entry>
</row>
<row>
<entry><literal>'w+'</literal></entry>
<entry>
Открывает файл для чтения и записи; помещает указатель
в начало файла и обрезает файл до нулевой длины.
Если файл не существует - пытается его создать.
</entry>
</row>
<row>
<entry><literal>'a'</literal></entry>
<entry>
Открывает файл только для записи; помещает указатель в конец
файла. Если файл не существует - пытается его создать.
В данном режиме функция <function>fseek</function> не применима, записи всегда добавляются в конец.
</entry>
</row>
<row>
<entry><literal>'a+'</literal></entry>
<entry>
Открывает файл для чтения и записи; помещает указатель в конец
файла. Если файл не существует - пытается его создать. В данном режиме функция <function>fseek</function> влияет только на позицию чтения, записи всегда добавляются в конец.
</entry>
</row>
<row>
<entry><literal>'x'</literal></entry>
<entry>
Создаёт и открывает только для записи; помещает указатель в
начало файла. Если файл уже существует, вызов
<function>fopen</function> закончится неудачей, вернёт &false; и
выдаст ошибку уровня <constant>E_WARNING</constant>.
Если файл не существует, попытается его создать. Это эквивалентно
указанию флагов <literal>O_EXCL|O_CREAT</literal> для внутреннего
системного вызова <literal>open(2)</literal>.
</entry>
</row>
<row>
<entry><literal>'x+'</literal></entry>
<entry>
Создаёт и открывает для чтения и записи; в остальном имеет то же поведение, что и<literal>'x'</literal>.
</entry>
</row>
<row>
<entry><literal>'c'</literal></entry>
<entry>
Открывает файл только для записи. Если файл не существует, то он создаётся.
Если же файл существует, то он не обрезается (в отличие от
<literal>'w'</literal>), и вызов к этой функции не вызывает ошибку (также как
и в случае с <literal>'x'</literal>). Указатель на файл будет установлен
на начало файла. Это может быть полезно при желании заблокировать
файл (смотрите <function>flock</function>) перед изменением, так как использование
<literal>'w'</literal> может обрезать файл ещё до того как была получена блокировка
(если вы желаете обрезать файл, можно использовать функцию
<function>ftruncate</function> после запроса на блокировку).
</entry>
</row>
<row>
<entry><literal>'c+'</literal></entry>
<entry>
Открывает файл для чтения и записи; в остальном имеет то же поведение, что и <literal>'c'</literal>.
</entry>
</row>
<row>
<entry><literal>'e'</literal></entry>
<entry>
Установить флаг close-on-exec (закрыть при запуске) на открытый файловый
дескриптор. Доступно только в PHP скомпилированном на системах
поддерживающих POSIX.1-2008.
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<note>
<para>
Разные семейства операционных систем имеют разные соглашения
относительно окончания строк. Когда вы пишете текст и хотите вставить
разрыв строки, вы должны использовать правильные символы (или символ) для
вашей операционной системы. Системы семейства Unix используют
<literal>\n</literal> в качестве символа конца строки, системы
семейства Windows используют <literal>\r\n</literal> в качестве
символов окончания строки и системы семейства Macintosh (Mac OS Classic) используют
<literal>\r</literal> в качестве символа конца строки.
</para>
<para>
Если вы используете неверный символ конца строки при редактировании
файлов, вы можете обнаружить, что при открытии эти файлы "странно
выглядят".
</para>
<para>
Windows предлагает флаг режима текстовой трансляции
(<literal>'t'</literal>), который автоматически переведёт
<literal>\n</literal> в <literal>\r\n</literal> во время работы с файлом.
И наоборот - вы также можете использовать <literal>'b'</literal>, чтобы
принудительно включить бинарный режим, в котором ваши данные
не будут преобразовываться. Чтобы использовать эти режимы, укажите
<literal>'b'</literal> или <literal>'t'</literal> последней
буквой параметра <parameter>mode</parameter>.
</para>
<para>
Флагом трансляции по умолчанию является <literal>'b'</literal>.
Вы можете использовать режим
<literal>'t'</literal>, если работаете с текстовыми файлами и
используете <literal>\n</literal> для обозначения
конца строки в вашем скрипте, но при этом предполагаете,
что ваши файлы будут использоваться в таких приложениях, как "Блокнот" (в устаревших версиях).
Во всех остальных случаях используйте флаг <literal>'b'</literal>.
</para>
<para>
Если вы укажете флаг 't' во время работы с бинарными файлами,
вы можете столкнуться со странными проблемами с вашими данными, включая
повреждённые файлы изображений и проблемы с символами <literal>\r\n</literal>.
</para>
</note>
<note>
<para>
Опять же из соображений портируемости крайне
рекомендуется переписать старый код, который полагается на режим
<literal>'t'</literal>, чтобы вместо этого он использовал правильные
концы строк и режим <literal>'b'</literal>.
</para>
</note>
<note>
<simpara>
Параметр <parameter>mode</parameter> игнорируется при работе с
обёртками потока <filename>php://output</filename>,
<filename>php://input</filename>, <filename>php://stdin</filename>,
<filename>php://stdout</filename>, <filename>php://stderr</filename> и
<filename>php://fd</filename>.
</simpara>
</note>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>use_include_path</parameter></term>
<listitem>
<para>
Необязательный третий параметр <parameter>use_include_path</parameter>
может быть установлен в '1' или &true;, если вы также хотите провести
поиск файла в <link linkend="ini.include-path">include_path</link>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>context</parameter></term>
<listitem>
&note.context-support;
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Возвращает указатель на файл в случае успешного выполнения&return.falseforfailure;
</para>
</refsect1>
<refsect1 role="errors">
&reftitle.errors;
&fs.emits.warning.on.failure;
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>7.0.16, 7.1.2</entry>
<entry>
Добавлена опция <literal>'e'</literal>.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Примеры использования <function>fopen</function></title>
<programlisting role="php">
<![CDATA[
<?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");
?>
]]>
</programlisting>
</example>
</para>
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
&warn.ssl-non-standard;
<note>
<para>
Если вы сталкиваетесь с проблемами во время чтения или записи
файлов, и вы используете PHP в виде серверного модуля, убедитесь
в том, что процесс сервера имеет доступ к используемым вами файлам и директориям.
</para>
</note>
<note>
<para>
Данная функция также может принимать директории в качестве параметра <parameter>filename</parameter>.
Если вы не знаете, является ли <parameter>filename</parameter> файлом или директорией,
то вам может понадобиться использовать функцию <function>is_dir</function>
до вызова функции <function>fopen</function>.
</para>
</note>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><xref linkend="wrappers"/></member>
<member><function>fclose</function></member>
<member><function>fgets</function></member>
<member><function>fread</function></member>
<member><function>fwrite</function></member>
<member><function>fsockopen</function></member>
<member><function>file</function></member>
<member><function>file_exists</function></member>
<member><function>is_readable</function></member>
<member><function>stream_set_timeout</function></member>
<member><function>popen</function></member>
<member><function>stream_context_create</function></member>
<member><function>umask</function></member>
<member><classname>SplFileObject</classname></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->