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