fsockopen

(PHP 4, PHP 5, PHP 7, PHP 8)

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

Описание

fsockopen(
    string $hostname,
    int $port = -1,
    int &$error_code = null,
    string &$error_message = null,
    ?float $timeout = null
): resource|false

Функция устанавливает соединение с сокетом ресурса 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.

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

  • pfsockopen() - Открывает постоянное соединение с интернет-сокетом или доменным сокетом Unix
  • stream_socket_client() - Открывает соединение с интернет-сокетом или с доменным Unix-сокетом
  • stream_set_blocking() - Устанавливает блокирующий или неблокирующий режим для потока
  • stream_set_timeout() - Устанавливает значение времени ожидания для потока
  • fgets() - Получает строку из указателя на файл
  • fgetss() - Читает строку из файла и удаляет HTML-теги
  • fwrite() - Записывает данные в файл в бинарно-безопасном режиме
  • fclose() - Закрывает открытый дескриптор файла
  • feof() - Проверяет, достигнут ли конец файла
  • socket_connect() - Начинает соединение с сокетом
  • Модуль Curl