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-доменах в том виде, как они описаны в Список поддерживаемых транспортных протоколов. Список поддерживаемых транспортов можно получить с помощью функции stream_get_transports().

По умолчанию сокет будет открыт в блокирующем режиме. Переключить его в неблокирующих режим можно функцией stream_set_blocking().

stream_socket_client() выполняет аналогичную функцию, но предоставляет более широкий выбор настроек соединения, включающий установку неблокирующего режима и возможность предоставления потокового контекста.

Список параметров

hostname

Если установлена поддержка OpenSSL, можно использовать SSL- или TLS-протоколы соединений поверх TCP/IP при подключении к удалённому хосту. Для этого перед hostname нужно добавить префикс ssl:// или tls://.

port

Номер порта. Его можно не указывать, передав -1 для тех протоколов, которые не используют порты, например unix://.

error_code

Если этот параметр предоставить, то в случае возникновения ошибки системного вызова функции connect() он будет принимать номер этой ошибки.

Если значение параметра error_code равно 0, а функция вернула false, значит ошибка произошла до вызова connect(). В большинстве случаев это свидетельствует о проблемах при инициализации сокета.

error_message

Сообщение об ошибке в виде строки.

timeout

Время ожидания соединения в секундах. Если null, используется настройка php.ini default_socket_timeout.

Замечание:

Если требуется установить время ожидания чтения/записи данных через сокет, используйте функцию 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