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
Прямой аналог, полностью идентичен по функционалу. Рекомендуется к использованию, так как socket_get_status считается устаревшим алиасом.
Возвращает список доступных транспортных протоколов, но не предоставляет состояния конкретного сокета.
Используются для получения информации об ошибках сокетов, но не дают общего статуса соединения.
Аналоги в других языках
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
const net = require('net');
const socket = net.createConnection(80, 'nodejs.org');
socket.on('connect', () => {
console.log(socket.readyState);
});open
Показывает активные соединения, но на более высоком уровне абстракции.
Типичные ошибки
<?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 может быть неточным для некоторых типов потоков.
Изменения в версиях PHP
Функция формально существует как псевдоним stream_get_meta_data(). Документация рекомендует использовать основной вариант.
Улучшена обработка потоковых ресурсов, но сигнатура функции не изменялась.
В PHP 5.6 и ранее функция возвращала дополнительное поле crypto_params для SSL-соединений.
Расширенные примеры
<?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
$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
$socket = stream_socket_client('tcp://php.net:80');
stream_set_blocking($socket, false);
$status = socket_get_status($socket);
echo 'Блокировка: '.($status['blocked']?'да':'нет');
?>Блокировка: нет