Socket get option: примеры (PHP)

Функция socket_get_option для работы с сокетами в PHP
Раздел: Сокеты
socket_get_option(resource socket, int level, int optname): mixed
Описание функции 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)  # 0
JavaScript (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