Socket get option: примеры (PHP)
Функция socket_get_option для работы с сокетами в PHP
Раздел: Сокеты
socket_get_option(resource socket, int level, int optname): mixedтиповые примерыsocket get option на js, python, mysqlsocket get option изменения phpпримеры расширенные
Описание функции socket_get_option
Функция socket_get_option получает значение параметра для указанного сокета. Она применяется при низкоуровневом сетевом программировании для настройки или диагностики сокетов.
Синтаксис и аргументы
socket_get_option(
\Socket $socket,
int $level,
int $option
): mixed- $socket – экземпляр класса
\Socket, созданный функциейsocket_create. - $level – уровень протокола, на котором находится опция. Используются предопределенные константы:
SOL_SOCKET,SOL_TCP,SOL_UDP,IPPROTO_IPи другие. - $option – конкретная опция для получения. Доступные константы зависят от уровня:
SO_REUSEADDR,SO_KEEPALIVE,TCP_NODELAYи прочие.
Функция возвращает значение параметра или false при ошибке.
Базовые примеры использования
Получение таймаута на чтение
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$timeout = socket_get_option($socket, SOL_SOCKET, SO_RCVTIMEO);
var_dump($timeout);array(2) {
["sec"]=>
int(0)
["usec"]=>
int(0)
}Проверка опции SO_REUSEADDR
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$reuse = socket_get_option($socket, SOL_SOCKET, SO_REUSEADDR);
var_dump($reuse); // int(0) – значение по умолчаниюint(0)Получение параметра TCP_NODELAY
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$nodelay = socket_get_option($socket, SOL_TCP, TCP_NODELAY);
var_dump($nodelay);int(0)Похожие функции в PHP
- socket_set_option – устанавливает значение параметра сокета. Используется вместе с
socket_get_optionдля конфигурации. - socket_getpeername – получает адрес удаленного узла, связанного с сокетом. Применяется для идентификации подключения.
- socket_getsockname – возвращает адрес локального сокета. Полезна при работе с несколькими сетевыми интерфейсами.
- stream_context_get_options – получает параметры контекста потоков. Альтернативный высокоуровневый подход к сетевому программированию.
Функция socket_get_option предпочтительна при необходимости точного контроля над параметрами сокета на низком уровне.
Аналоги в других языках
Python: getsockopt
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
value = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
print(value) # 0JavaScript (Node.js): socket.getOption
const dgram = require('dgram');
const socket = dgram.createSocket('udp4');
// В Node.js опции часто устанавливаются при создании сокета
// Прямого аналога socket_get_option нет, используются методы setBroadcast и т.д.C: getsockopt
#include
int getsockopt(int sockfd, int level, int optname,
void *optval, socklen_t *optlen); В отличие от PHP, где функция возвращает разнотипные значения, в C значение записывается в буфер, а в Python возвращается целое число.
Типичные ошибки
Передача несуществующего ресурса сокета
$result = socket_get_option(false, SOL_SOCKET, SO_TYPE);
var_dump($result);PHP Warning: socket_get_option() expects parameter 1 to be Socket, bool givenИспользование неверного уровня протокола
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_get_option($socket, 99999, SO_REUSEADDR);
var_dump($result);bool(false)Запрос неподдерживаемой опции
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_get_option($socket, SOL_SOCKET, 99999);
if ($result === false) {
echo 'Ошибка: ' . socket_strerror(socket_last_error());
}Ошибка: Invalid argumentИзменения в версиях PHP
- PHP 8.0: параметр
$socketтеперь ожидает экземпляр класса\Socketвместо ресурса. Старая сигнатура с ресурсом вызывает фатальную ошибку. - PHP 8.2: добавлены новые константы опций сокетов, такие как
SO_INCOMING_CPUиSO_MEMINFO, доступные в зависимости от операционной системы. - PHP 8.3: улучшена обработка ошибок для недопустимых комбинаций уровня и опции.
Расширенные примеры
Диагностика типа сокета
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$type = socket_get_option($socket, SOL_SOCKET, SO_TYPE);
switch ($type) {
case SOCK_STREAM: echo 'Потоковый сокет (TCP)'; break;
case SOCK_DGRAM: echo 'Дейтаграммный сокет (UDP)'; break;
default: echo 'Неизвестный тип: ' . $type;
}Потоковый сокет (TCP)Получение размера буфера
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
$sendBuf = socket_get_option($socket, SOL_SOCKET, SO_SNDBUF);
$recvBuf = socket_get_option($socket, SOL_SOCKET, SO_RCVBUF);
echo "Размер буфера отправки: $sendBuf байт\n";
echo "Размер буфера приема: $recvBuf байт";Размер буфера отправки: 131072 байт
Размер буфера приема: 131072 байтМониторинг состояния опции SO_KEEPALIVE
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_KEEPALIVE, 1);
$keepalive = socket_get_option($socket, SOL_SOCKET, SO_KEEPALIVE);
if ($keepalive) {
echo 'Keepalive включен';
// Получение интервалов keepalive (если поддерживается ОС)
$tcp_keepidle = socket_get_option($socket, SOL_TCP, TCP_KEEPIDLE);
echo ', TCP_KEEPIDLE: ' . ($tcp_keepidle !== false ? $tcp_keepidle : 'не поддерживается');
}Keepalive включен, TCP_KEEPIDLE: 7200Работа с IPv6 опциями
$socket = @socket_create(AF_INET6, SOCK_STREAM, SOL_TCP);
if ($socket) {
$v6only = socket_get_option($socket, IPPROTO_IPV6, IPV6_V6ONLY);
var_dump($v6only);
}int(1)PHP socket_get_option function comments
En
Socket get option Gets socket options for the socket