1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-26 00:32:15 +01:00
Files
archived-doc-ru/reference/network/functions/fsockopen.xml
Mikhail Alferov 1d5690a725 fsockopen.xml: уточнил перевод
Думаю, что перевод «параметр будет содержать» (holds) недостаточно объясняет концепцию `out-параметра`, который, в отличие от `in-` (традиционная передача аргумента  в параметр ф-ции: &foo) или `inout-параметра` (который, по сути, то же, что передача аргумента по ссылке, — когда переменную предваряют знаком амперсанда: &$foo) инициализируется не «снаружи», а «внутри» функции.

Вообще PHP-документация не объясняет in-, out- и inout-типы параметров. Поэтому у программистов, а особенно у тех, кто только начинает путь, возникает путаница и вопросы, на которые на которые руководство не даёт ясных ответов. Так было и со мной, когда впервые знакомился с функцией `preg_match()` и не понимал, _как_ (?!) можно передавать в функцию аргумент для параметра `matches`, если снаружи функции переменная `$matches` не существует, и ещё сложнее было, когда переменную называли другим именем :-) Параметр `matches` как раз играет роль `out-параметра`, которому не требуется инициализация перед вызовом функции `preg_match()`; функция (!) инициализирует параметр, присвоит параметру значение и «выбросит» переменную наружу.

Поэтому пока остановимся на варианте «функция заполнит параметр», чтобы хотя бы намекнуть на то, что параметр не требует инициализации перед вызовом функции, а функция сама присвоит параметру значение
2024-06-28 11:31:26 +03:00

269 lines
11 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: 4e6f0774f03131cbeeb8c21019a690bf97fd22b6 Maintainer: tmn Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="function.fsockopen" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>fsockopen</refname>
<refpurpose>
Открывает соединение с сокетом интернет- или Unix-домена
</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type class="union"><type>resource</type><type>false</type></type><methodname>fsockopen</methodname>
<methodparam><type>string</type><parameter>hostname</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>port</parameter><initializer>-1</initializer></methodparam>
<methodparam choice="opt"><type>int</type><parameter role="reference">error_code</parameter><initializer>&null;</initializer></methodparam>
<methodparam choice="opt"><type>string</type><parameter role="reference">error_message</parameter><initializer>&null;</initializer></methodparam>
<methodparam choice="opt"><type class="union"><type>float</type><type>null</type></type><parameter>timeout</parameter><initializer>&null;</initializer></methodparam>
</methodsynopsis>
<para>
Функция устанавливает соединение с сокетом ресурса
<parameter>hostname</parameter>.
</para>
<para>
PHP поддерживает целевые ресурсы в интернет- и Unix-доменах так, как
описывает «<xref linkend="transports"/>». Список транспортов, которые поддерживает PHP,
также возвращает функция <function>stream_get_transports</function>.
</para>
<para>
По умолчанию функция откроет сокет в блокирующем режиме. Сокет переключают
в неблокирующий режим функцией <function>stream_set_blocking</function>.
</para>
<para>
Функция <function>stream_socket_client</function> работает аналогично,
но даёт более богатый набор настроек соединения, который включает поддержку
неблокирующих соединений и возможность предоставить потоковый контекст.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>hostname</parameter></term>
<listitem>
<para>
Разрешается добавлять к имени хоста <parameter>hostname</parameter> префиксы
<literal>ssl://</literal> или <literal>tls://</literal>
и использовать при подключении к удалённому хосту клиентские
SSL- или TLS-соединения поверх стека протоколов TCP/IP,
если <link linkend="openssl.installation">установили</link> поддержку
библиотеки OpenSSL.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>port</parameter></term>
<listitem>
<para>
Номер порта. Номер порта разрешается не указывать или пропустить
за счёт значения <literal>-1</literal> для протоколов, которые не используют порты, например
<literal>unix://</literal>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>error_code</parameter></term>
<listitem>
<para>
Функция заполнит параметр номером ошибки системного уровня, которая возникла
при вызове функции <literal>connect()</literal>, если аргумент указали при вызове функции.
</para>
<para>
Значение <literal>0</literal>, которое вернулось в параметр <parameter>error_code</parameter>,
и значение &false;, которое вернула функция, указывают, что ошибка возникла
до вызова функции <literal>connect()</literal>. В большей части случаев это
связано с ошибкой инициализации сокета.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>error_message</parameter></term>
<listitem>
<para>
Сообщение об ошибке в виде строки.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>timeout</parameter></term>
<listitem>
<para>
Время ожидания соединения в секундах.
Функция будет использовать настройку <link linkend="ini.default-socket-timeout">default_socket_timeout</link>
из файла &php.ini;, если значение равно &null;.
</para>
<note>
<para>
Если требуется установить время ожидания для чтения или записи данных через сокет,
вызывают функцию <function>stream_set_timeout</function>, поскольку
параметр <parameter>timeout</parameter> функции <function>fsockopen</function>
ограничивает только время установки соединения с сокетом.
</para>
</note>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Функция <function>fsockopen</function> возвращает файловый указатель, который
можно использовать с другими функциями, которые работают с файлами (например,
<function>fgets</function>, <function>fgetss</function>,
<function>fwrite</function>, <function>fclose</function>
и <function>feof</function>). Функция возвращает &false;, если вызов завершится ошибкой.
</para>
</refsect1>
<refsect1 role="errors">
&reftitle.errors;
<para>
Функция выдаёт ошибку уровня <constant>E_WARNING</constant>, если
в параметр <parameter>hostname</parameter> передали недопустимый домен.
</para>
</refsect1>
<refsect1 role="changelog"><!-- {{{ -->
&reftitle.changelog;
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>8.0.0</entry>
<entry>
Параметр <parameter>timeout</parameter> теперь принимает значение null.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Пример использования функции <function>fsockopen</function></title>
<programlisting role="php">
<![CDATA[
<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.example.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title>Пример установки UDP-соединения</title>
<para>
Пример показывает, как получить день и время от UDP-службы
daytime (которая работает на порте номер 13) на текущей машине.
</para>
<programlisting role="php">
<![CDATA[
<?php
$fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
if (!$fp) {
echo "ERROR: $errno - $errstr<br />\n";
} else {
fwrite($fp, "\n");
echo fread($fp, 26);
fclose($fp);
}
?>
]]>
</programlisting>
</example>
</para>
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
<note>
<para>
В зависимости от окружения, Unix-домен или время ожидания установки подключения
могут оказаться недоступными.
</para>
</note>
<warning>
<para>
Иногда UDP-сокеты получают статус открытых, даже если удалённый хост
недоступен. Ошибка становится очевидной только при чтении или записи
данных в сокет или из него. Причина этого заключается в том, что протокол UDP передаёт
данные без установки соединения, а это означает, что операционная система
не устанавливает и не держит соединение с сокетом, пока не начнётся передача данных.
</para>
</warning>
&ipv6.brackets;
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>pfsockopen</function></member>
<member><function>stream_socket_client</function></member>
<member><function>stream_set_blocking</function></member>
<member><function>stream_set_timeout</function></member>
<member><function>fgets</function></member>
<member><function>fgetss</function></member>
<member><function>fwrite</function></member>
<member><function>fclose</function></member>
<member><function>feof</function></member>
<member><function>socket_connect</function></member>
<member><link linkend="ref.curl">Модуль Curl</link></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
-->