(PHP 4, PHP 5, PHP 7, PHP 8)
fsockopen — Открывает соединение с сокетом интернет- или Unix-домена
$hostname
,$port
= -1,&$error_code
= null
,&$error_message
= null
,$timeout
= null
Функция устанавливает соединение с сокетом ресурса
hostname
.
PHP поддерживает целевые ресурсы в интернет- и Unix-доменах так, как описывает «Список транспортных протоколов для работы с сокетами». Список транспортов, которые поддерживает PHP, также возвращает функция stream_get_transports().
По умолчанию функция откроет сокет в блокирующем режиме. Сокет переключают в неблокирующий режим функцией stream_set_blocking().
Функция stream_socket_client() работает аналогично, но даёт более богатый набор настроек соединения, который включает поддержку неблокирующих соединений и возможность предоставить потоковый контекст.
hostname
Разрешается добавлять к имени хоста hostname
префиксы
ssl://
или tls://
и использовать при подключении к удалённому хосту клиентские
SSL- или TLS-соединения поверх стека протоколов TCP/IP,
если установили поддержку
библиотеки OpenSSL.
port
Номер порта. Номер порта разрешается не указывать или пропустить
за счёт значения -1
для протоколов, которые не используют порты, например
unix://
.
error_code
Функция заполнит параметр номером ошибки системного уровня, которая возникла
при вызове функции connect()
, если аргумент указали при вызове функции.
Значение 0
, которое вернулось в параметр error_code
,
и значение false
, которое вернула функция, указывают, что ошибка возникла
до вызова функции connect()
. В большей части случаев это
связано с ошибкой инициализации сокета.
error_message
Сообщение об ошибке в виде строки.
timeout
Время ожидания соединения в секундах.
Функция будет использовать настройку default_socket_timeout
из файла php.ini, если значение равно null
.
Замечание:
Если требуется установить время ожидания для чтения или записи данных через сокет, вызывают функцию stream_set_timeout(), поскольку параметр
timeout
функции fsockopen() ограничивает только время установки соединения с сокетом.
Функция fsockopen() возвращает файловый указатель, который
можно использовать с другими функциями, которые работают с файлами (например,
fgets(), fgetss(),
fwrite(), fclose()
и feof()). Функция возвращает false
, если вызов завершится ошибкой.
Функция выдаёт ошибку уровня E_WARNING
, если
в параметр hostname
передали недопустимый домен.
Версия | Описание |
---|---|
8.0.0 |
Параметр timeout теперь принимает значение null.
|
Пример #1 Пример использования функции fsockopen()
<?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);
}
?>
Пример #2 Пример установки UDP-соединения
Пример показывает, как получить день и время от UDP-службы daytime (которая работает на порте номер 13) на текущей машине.
<?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);
}
?>
Замечание:
В зависимости от окружения, Unix-домен или время ожидания установки подключения могут оказаться недоступными.
Иногда UDP-сокеты получают статус открытых, даже если удалённый хост недоступен. Ошибка становится очевидной только при чтении или записи данных в сокет или из него. Причина этого заключается в том, что протокол UDP передаёт данные без установки соединения, а это означает, что операционная система не устанавливает и не держит соединение с сокетом, пока не начнётся передача данных.
Замечание: Числовые IPv6-адреса наподобие
fe80::1
берут в квадратные скобки. Например:tcp://[fe80::1]:80
.