PHP 8.4.1 Released!

stream_socket_client

(PHP 5, PHP 7, PHP 8)

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

Описание

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

Добавить

Примечания пользователей 2 notes

up
22
nicholas at nicholaswilliams dot net
16 years ago
For those wanting to use stream_socket_client() to connect to a local UNIX socket who can't find documentation on how to do it, here's a (rough) example:

<?php

$sock
= stream_socket_client('unix:///full/path/to/my/socket.sock', $errno, $errstr);

fwrite($sock, 'SOME COMMAND'."\r\n");

echo
fread($sock, 4096)."\n";

fclose($sock);

?>
up
10
Vasil Rangelov a.k.a. boen_robot
13 years ago
The remote_socket argument, in its end (well... after the port), can also contain a "/" followed by a unique identifier. This is especially useful if you want to create multiple persistent connections to the same transport://host:port combo.

Example:
<?php
$socket
= stream_socket_client('tcp://mysql.example.com:3306/root', $errorno, $errorstr, $timeout, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT);
?>

Note that while (p)fsockopen() follows a similar scheme, it doesn't have this particular feature.
To Top