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

Socket get status в PHP: практическое применение
Раздел: Сокеты
socket_get_status(resource stream): array

Функция socket_get_status

Описание

Функция socket_get_status в PHP используется для получения текущего состояния потокового ресурса, такого как сокет или файл. Возвращает ассоциативный массив с метаданными. Основное применение - анализ состояния сетевых соединений, таймаутов, блокировки и других параметров.

Аргументы

Функция принимает один обязательный параметр:

  • stream (resource) - потоковый ресурс (например, возвращенный функциями fsockopen() или stream_socket_client()).

Примеры использования

Базовый пример с сокетом
<?php
$socket = fsockopen('php.net', 80);
$status = socket_get_status($socket);
print_r($status);
?>
Array
(
    [timed_out] =>
    [blocked] => 1
    [eof] =>
    [unread_bytes] => 0
    [stream_type] => tcp_socket
    [wrapper_type] =>
    [wrapper_data] =>
    [mode] => r+
    [seekable] =>
    [uri] => php.net:80
)
Проверка таймаута
<?php
$socket = stream_socket_client('tcp://example.com:80', $errno, $errstr, 1);
stream_set_timeout($socket, 0, 100000); // Установка таймаута
sleep(2); // Имитация задержки
$status = socket_get_status($socket);
echo $status['timed_out'] ? 'Таймаут' : 'Нет таймаута';
?>
Таймаут

Похожие функции в PHP

stream_get_meta_data()

Прямой аналог, полностью идентичен по функционалу. Рекомендуется к использованию, так как socket_get_status считается устаревшим алиасом.

stream_get_transports()

Возвращает список доступных транспортных протоколов, но не предоставляет состояния конкретного сокета.

socket_last_error() и socket_strerror()

Используются для получения информации об ошибках сокетов, но не дают общего статуса соединения.

Аналоги в других языках

Python: socket.getsockopt()
import socket
s = socket.socket()
s.connect(('python.org', 80))
print(s.getsockopt(socket.SOL_SOCKET, socket.SO_TYPE))
print(s.gettimeout())
1 # SOCK_STREAM
None
JavaScript (Node.js): socket.readyState
const net = require('net');
const socket = net.createConnection(80, 'nodejs.org');
socket.on('connect', () => {
    console.log(socket.readyState);
});
open
MySQL: SHOW PROCESSLIST

Показывает активные соединения, но на более высоком уровне абстракции.

Типичные ошибки

Передача нересурсного значения
<?php
$status = socket_get_status('not_a_resource');
?>
Warning: socket_get_status() expects parameter 1 to be resource, string given
Использование с закрытым сокетом
<?php
$socket = fsockopen('php.net', 80);
fclose($socket);
$status = socket_get_status($socket);
?>
Warning: socket_get_status(): supplied resource is not a valid stream resource
Неверная интерпретация unread_bytes

Значение unread_bytes может быть неточным для некоторых типов потоков.

Изменения в версиях PHP

PHP 8.0

Функция формально существует как псевдоним stream_get_meta_data(). Документация рекомендует использовать основной вариант.

PHP 7.4

Улучшена обработка потоковых ресурсов, но сигнатура функции не изменялась.

Исторические версии

В PHP 5.6 и ранее функция возвращала дополнительное поле crypto_params для SSL-соединений.

Расширенные примеры

Мониторинг нескольких сокетов
Пример php
<?php
$hosts = ['php.net', 'github.com', 'google.com'];
$sockets = [];
foreach ($hosts as $host) {
    $sockets[$host] = fsockopen($host, 80, $errno, $errstr, 1);
}
foreach ($sockets as $host => $socket) {
    $status = socket_get_status($socket);
    echo "$host: ".($status['timed_out']?'Недоступен':'Доступен')."\n";
}
?>
php.net: Доступен
github.com: Доступен
google.com: Доступен
Анализ типа потока
Пример php
<?php
$resources = [
    'socket' => fsockopen('php.net', 80),
    'file' => fopen(__FILE__, 'r'),
    'http' => fopen('http://php.net', 'r')
];
foreach ($resources as $type => $resource) {
    $status = socket_get_status($resource);
    echo "$type: {$status['stream_type']}\n";
}
?>
socket: tcp_socket
file: plainfile
http: http
Определение блокировки потока
Пример php
<?php
$socket = stream_socket_client('tcp://php.net:80');
stream_set_blocking($socket, false);
$status = socket_get_status($socket);
echo 'Блокировка: '.($status['blocked']?'да':'нет');
?>
Блокировка: нет

PHP socket_get_status function comments

En
Socket get status Alias of stream_get_meta_data