(PHP 4, PHP 5)
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
Номер порта.
errno
Если этот параметр предоставить, то в случае ошибки системного вызова функции connect() он будет принимать номер этой ошибки.
Если значение параметра errno
равно
0, а функция вернула FALSE
, значит ошибка произошла
до вызова connect(). В большинстве случаев это
свидетельствует о проблемах при инициализации сокета.
errstr
Сообщение об ошибке в виде строки.
timeout
Таймаут соединения в секундах.
Замечание:
Если требуется установить таймаут чтения/записи данных через сокет, используйте фукнцию stream_set_timeout(), так как параметр
timeout
фукнции fsockopen() ограничивает только время процесса установки соединения с сокетом.
fsockopen() возвращает файловый указатель, который можно
передавать в функции работающие с файлами (такие как
fgets(), fgetss(),
fwrite(), fclose() и
feof()). Если вызов завершится неудачей, функция вернет
FALSE
.
Вызывает ошибку уровня E_WARNING
, если
hostname
не является допустимым доменом.
Версия | Описание |
---|---|
4.3.0 |
Добавлена поддержка параметра timeout на платформах
win32.
|
4.3.0 | Добавлена поддержка SSL и TLS поверх TCP/IP. |
Пример #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.