Открывает соединение с интернет-сокетом или с доменным Unix-сокетом

# stream_socket_client

(PHP 5, PHP 7, PHP 8)

stream_socket_client — Открывает соединение с интернет-сокетом или с доменным Unix-сокетом

### Описание

function stream_socket_client(
string `$address`,
int `&$error_code` = `null`,
string `&$error_message` = `null`,
?float `$timeout` = `null`,
int `$flags` = `STREAM_CLIENT_CONNECT`,
?resource `$context` = `null`
): resource|false

Функция начинает соединение потока или датаграммы с удалённым сокетом, который указали в параметре `address`. Тип создаваемого сокета определяется по транспорту, который указали через стандартное форматирование URL-адреса: `transport://target`. Для сокетов интернет-домена (AF_INET) наподобие TCP и UDP часть `target` параметра `address` должна состоять из имени хоста или IP-адреса, за которым следует двоеточие и номер порта. Для доменных сокетов Unix часть `target` должна указывать на файл сокета в файловой системе.

> Замечание:

> По умолчанию поток будет открыт в блокирующем режиме. Можно переключить поток в неблокирующий режим функцией stream_set_blocking().

### Список параметров

`address`

  Адрес удалённого сокета для соединения.

`error_code`

  При сбое соединения функция присвоит параметру номер системной ошибки.

`error_message`

  При сбое соединения функция присвоит параметру сообщение о системной ошибке.

`timeout`

  Число секунд, в течение которых должно произойти время ожидания системного вызова `connect()`. По умолчанию используется значение директивы default_socket_timeout.

  > Замечание: Этот параметр применяется, только если попытки асинхронного подключения не предпринимаются.

  > Замечание:

  > Чтобы указать время ожидания для чтения или записи данных через сокет, вызывают функцию stream_set_timeout(), поскольку параметр `timeout` применяется только при создании соединения через сокет.

`flags`

  Поле битовой маски, которое может принимать значение любой комбинации флагов соединения. Пока набор флагов соединения ограничен следующими значениями: `STREAM_CLIENT_CONNECT` (по умолчанию), `STREAM_CLIENT_ASYNC_CONNECT` и `STREAM_CLIENT_PERSISTENT`.

`context`

  Допустимый ресурс контекста, который создали функцией stream_context_create().

### Возвращаемые значения

В случае успешного выполнения функция возвращает ресурс потока, который можно использовать с другими файловыми функциями (например, fgets(), fgetss(), fwrite(), fclose() и feof()); если возникла ошибка, функция возвращает `false`.

### Ошибки

В случае неудачного вызова функция заполнит параметры `error_code` и `error_message` системной ошибкой, которая произошла при системном вызове `connect()`. Если значение, которое вернулось в параметре `error_code`, равно `0` и функция вернула значение `false`, это означает, что ошибка произошла до вызова `connect()`. Это произошло, вероятно, из-за проблемы инициализации сокета. Примите во внимание, что параметры `error_code` и `error_message` каждый раз будут передаваться по ссылке.

### Список изменений

Версия | Описание
--- | ---
8.0.0 | Параметры `timeout` и `context` теперь принимают значение null.

### Примеры

Пример #1 Пример использования функции stream_socket_client()

    <?php

    $fp = stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30);

    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        fwrite($fp, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");

        while (!feof($fp)) {
            echo fgets($fp, 1024);
        }

        fclose($fp);
    }

    ?>

Пример #2 Пример UDP-соединения

Получения дня и времени от UDP-службы daytime (порт 13) на localhost.

    <?php

    $fp = stream_socket_client("udp://127.0.0.1:13", $errno, $errstr);

    if (!$fp) {
        echo "ОШИБКА: $errno - $errstr<br />\n";
    } else {
        fwrite($fp, "\n");
        echo fread($fp, 26);
        fclose($fp);
    }

    ?>

### Примечания

Внимание

UDP-сокеты иногда открываются без ошибки, даже если удалённый хост недоступен. Ошибка станет заметной, только когда данные будут читать из сокета или писать данные в сокет. Причина этого в том, что UDP — протокол без соединения, что означает, что операционная система не пытается установить соединение с сокетом, пока ей в действительности не нужно отправить или получить данные.

> Замечание: Числовые IPv6-адреса наподобие `fe80::1` берут в квадратные скобки. Например: `tcp://[fe80::1]:80`.

> Замечание:

> В зависимости от окружения Unix-домены или произвольное время ожидания соединения могут быть недоступны. Список доступных транспортов можно получить функцией stream_get_transports(). Смотрите список встроенных транспортов на странице Список транспортов для работы с сокетами.

### Смотрите также

- stream_socket_server() - Создаёт серверный сокет Internet- или Unix-домена
- stream_set_blocking() - Устанавливает блокирующий или неблокирующий режим для потока
- stream_set_timeout() - Устанавливает значение времени ожидания для потока
- stream_select() - Запускает эквивалент системного вызова select() на массивах потоков со временем ожидания в секундах и микросекундах
- fgets() - Получает строку из указателя на файл
- fgetss() - Читает строку из файла и удаляет HTML-теги
- fwrite() - Записывает данные в файл в бинарно-безопасном режиме
- fclose() - Закрывает открытый дескриптор файла
- feof() - Проверяет, достигнут ли конец файла
- Функции cURL

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open