(PHP 4, PHP 5, PHP 7)
fsockopen — Открывает соединение с интернет сокетом или доменным сокетом Unix
$hostname
[, int $port
= -1
[, int &$errno
[, string &$errstr
[, float $timeout
= ini_get("default_socket_timeout")
]]]] )
Устанавливает соединение с сокетом ресурса
hostname
.
PHP поддерживает целевые ресурсы в интернете и Unix доменах в том виде, как они описаны в Список поддерживаемых транспортных протоколов. Список поддерживаемых транспортов можно получить с помощью функции stream_get_transports().
По умолчанию, сокет будет открыт в блокирующем режиме. Переключить его в неблокирующих режим можно функцией stream_set_blocking().
stream_socket_client() выполняет аналогичную функцию, но предоставляет более широкий выбор настроек соединения, включающий установку неблокирующего режима и возможность предоставления потокового контекста.
hostname
Если установлена поддержка
OpenSSL, можно использовать SSL или TLS протоколы соединений поверх
TCP/IP при подключении к удаленному хосту. Для этого перед
hostname
нужно добавить префикс
ssl:// или tls://.
port
Номер порта. Его можно не указывать, передав -1 для тех протоколов, которые не используют порты, например unix://.
errno
Если этот параметр предоставить, то в случае ошибки системного вызова функции connect() он будет принимать номер этой ошибки.
Если значение параметра errno
равно
0, а функция вернула FALSE
, значит ошибка произошла
до вызова connect(). В большинстве случаев это
свидетельствует о проблемах при инициализации сокета.
errstr
Сообщение об ошибке в виде строки.
timeout
Таймаут соединения в секундах.
Замечание:
Если требуется установить таймаут чтения/записи данных через сокет, используйте функцию stream_set_timeout(), так как параметр
timeout
функции fsockopen() ограничивает только время процесса установки соединения с сокетом.
fsockopen() возвращает файловый указатель, который можно
передавать в функции работающие с файлами (такие как
fgets(), fgetss(),
fwrite(), fclose() и
feof()). Если вызов завершится неудачей, функция вернет
FALSE
.
Вызывает ошибку уровня E_WARNING
, если
hostname
не является допустимым доменом.
Пример #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.