stream_socket_client
(PHP 5, PHP 7)
stream_socket_client — Открывает соединение с интернет-сокетом или с доменным сокетом Unix
Описание
$remote_socket
[, int &$errno
[, string &$errstr
[, float $timeout
= ini_get("default_socket_timeout")
[, int $flags
= STREAM_CLIENT_CONNECT
[, resource $context
]]]]] )
Начинает потоковое или датаграммное соединение с удалённым сокетом, указанным
параметром remote_socket
. Тип создаваемого сокета
определяется по транспорту, указанному с использованием стандартного форматирования URL:
transport://target. Для интернет-сокетов,
(AF_INET) таких, как TCP и UDP, часть target
параметра remote_socket
должна состоять из
имени хоста или IP-адреса, за которым следует двоеточие и номер порта. Для доменных
сокетов Unix, часть target
должна указывать на
файл сокета в файловой системе.
Замечание:
По умолчанию поток будет открыт в блокирующем режиме. Вы можете переключить его в неблокирующий режим, используя функцию stream_set_blocking().
Список параметров
-
remote_socket
-
Адрес удалённого сокета для соединения.
-
errno
-
Будет присвоен номер системной ошибки, если соединение не удалось установить.
-
errstr
-
Будет присвоено сообщение о системной ошибке, если соединение не удалось установить.
-
timeout
-
Число секунд, в течение которых должен произойти тайм-аут системного вызова connect().
Замечание: Этот параметр применяется только если не происходит попытка асинхронного соединения.
Замечание:
Чтобы указать тайм-аут для чтения/записи данных через сокет, используйте функцию 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
.
Ошибки
В случае неудачного вызова функции аргументы errno
и
errstr
будут заполнены системной ошибкой,
которая произошла при системном вызове
connect(). Если значение, возвращённое в аргументе
errno
равно 0 и функция
возвратила значение FALSE
, это означает, что ошибка
произошла до вызова connect(). Это произошло
скорее всего из-за проблемы инициализации сокета. Примите во внимание,
что аргументы errno
и
errstr
всегда будут передаваться по ссылке.
Примеры
Пример #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() на заданных массивах потоков с таймаутом, указанным параметрами tv_sec и tv_usec
- fgets() - Читает строку из файла
- fgetss() - Прочитать строку из файла и отбросить HTML-теги
- fwrite() - Бинарно-безопасная запись в файл
- fclose() - Закрывает открытый дескриптор файла
- feof() - Проверяет, достигнут ли конец файла
- cURL
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Другие базовые расширения
- Потоки
- set_socket_blocking
- stream_bucket_append
- stream_bucket_make_writeable
- stream_bucket_new
- stream_bucket_prepend
- stream_context_create
- stream_context_get_default
- stream_context_get_options
- stream_context_get_params
- stream_context_set_default
- stream_context_set_option
- stream_context_set_params
- stream_copy_to_stream
- stream_encoding
- stream_filter_append
- stream_filter_prepend
- stream_filter_register
- stream_filter_remove
- stream_get_contents
- stream_get_filters
- stream_get_line
- stream_get_meta_data
- stream_get_transports
- stream_get_wrappers
- stream_is_local
- stream_notification_callback
- stream_register_wrapper
- stream_resolve_include_path
- stream_select
- stream_set_blocking
- stream_set_chunk_size
- stream_set_read_buffer
- stream_set_timeout
- stream_set_write_buffer
- stream_socket_accept
- stream_socket_client
- stream_socket_enable_crypto
- stream_socket_get_name
- stream_socket_pair
- stream_socket_recvfrom
- stream_socket_sendto
- stream_socket_server
- stream_socket_shutdown
- stream_supports_lock
- stream_wrapper_register
- stream_wrapper_restore
- stream_wrapper_unregister
Коментарии
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);
?>
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.