W3docs

Fonction PHP socket_get_status() : Tout ce que vous devez savoir

Découvrez comment utiliser socket_get_status() en PHP pour vérifier l'état d'un flux, détecter les délais d'attente et gérer les connexions réseau.

Lorsque vous lisez ou écrivez dans une connexion réseau en PHP, vous avez souvent besoin de savoir si la connexion est toujours active, si une lecture a expiré ou combien d'octets attendent dans le tampon. La fonction socket_get_status() répond exactement à ces questions : elle retourne un instantané de l'état actuel d'un flux.

Ce chapitre explique ce que retourne socket_get_status(), quand chaque champ est important et comment l'utiliser en toute sécurité avec les délais d'attente et les flux non bloquants.

Qu'est-ce que la fonction socket_get_status() ?

socket_get_status() récupère l'état actuel d'une ressource de flux sous forme de tableau associatif. Il s'agit en fait d'un alias de stream_get_meta_data(), donc les deux retournent les mêmes données — socket_get_status() est simplement le nom historique conservé pour le code réseau.

Malgré son nom, la fonction est conçue pour les ressources de flux — le type retourné par fsockopen(), pfsockopen() ou stream_socket_client() — et non pour les ressources de socket de bas niveau créées par socket_create(). Passer le mauvais type de ressource peut déclencher des avertissements de dépréciation dans PHP 8+ et ne vous donnera pas les données attendues.

Comment utiliser la fonction socket_get_status() ?

L'utilisation de la fonction socket_get_status() est simple. Voici la syntaxe de la fonction :

La syntaxe PHP de la fonction socket_get_status()

socket_get_status(resource $stream): array

La fonction prend un paramètre :

  • $stream : La ressource de flux dont vous souhaitez récupérer l'état.

Elle retourne un tableau associatif. Les clés les plus utiles sont :

CléTypeSignification
timed_outbooltrue si la dernière lecture/écriture a dépassé le délai d'attente du flux.
blockedbooltrue si le flux est en mode bloquant.
eofbooltrue si la fin du flux a été atteinte (connexion fermée).
unread_bytesintOctets déjà lus dans le tampon interne de PHP mais pas encore consommés.
stream_typestringLe transport sous-jacent, par ex. tcp_socket/ssl.
wrapper_typestringLe wrapper gérant le flux, par ex. http.
modestringLe mode d'accès avec lequel le flux a été ouvert, par ex. r+.

Vérifier si une connexion est toujours ouverte

Voici un exemple minimal qui ouvre un flux TCP, lit une ligne et utilise socket_get_status() pour déterminer si le serveur a fermé la connexion :

Comment utiliser la fonction socket_get_status() ?

<?php

$stream = fsockopen("tcp://www.example.com", 80, $errno, $errstr, 30);
if (!$stream) {
    die("Error: $errstr ($errno)");
}

fwrite($stream, "GET / HTTP/1.0\r\nHost: www.example.com\r\n\r\n");
$line = fgets($stream);

$status = socket_get_status($stream);
echo $status["eof"] ? "Connection closed by server\n" : "Connection still open\n";

fclose($stream);
?>

Nous utilisons fsockopen() pour créer un flux et vérifier qu'il a été créé avec succès avant de faire quoi que ce soit d'autre. Après avoir envoyé une requête et lu une ligne avec fgets(), le champ eof nous indique si l'extrémité distante a terminé. Fermez toujours le flux avec fclose() lorsque vous avez terminé.

Détecter un délai d'attente de lecture

Le champ timed_out est ce qui rend socket_get_status() véritablement utile. Lorsque vous définissez un délai d'attente de lecture avec stream_set_timeout() (ou socket_set_timeout()), une lecture lente ne génère pas d'exception — fgets() retourne simplement false. Vous appelez ensuite socket_get_status() pour savoir pourquoi il a retourné false :

<?php

$stream = fsockopen("tcp://www.example.com", 80, $errno, $errstr, 30);
if (!$stream) {
    die("Error: $errstr ($errno)");
}

// Wait at most 2 seconds for data before giving up.
stream_set_timeout($stream, 2);

$line = fgets($stream); // We never sent a request, so nothing arrives.

$status = socket_get_status($stream);
if ($status["timed_out"]) {
    echo "Read timed out\n";
} else {
    echo "Got data\n";
}

fclose($stream);
?>

Comme aucune requête n'a été envoyée, le serveur n'a rien à répondre, le délai d'attente de 2 secondes se déclenche et le script affiche Read timed out. Sans socket_get_status(), vous ne pourriez pas distinguer un délai d'attente d'une véritable fin de flux — les deux font retourner false à fgets().

Quand utiliser socket_get_status() ?

  • Après un échec de lecture. fgets()/fread() retournant false est ambigu ; vérifiez timed_out et eof pour savoir ce qui s'est passé.
  • Avant de réutiliser une connexion. Inspectez eof pour confirmer qu'un socket keep-alive est toujours actif avant d'envoyer une autre requête.
  • Avec des flux non bloquants. Lorsque vous appelez stream_set_blocking() pour rendre un socket non bloquant, unread_bytes et blocked vous aident à raisonner sur les données mises en tampon.

Points à surveiller

  • Cette fonction fonctionne uniquement sur les ressources de flux — pas sur les ressources socket_create(). Pour celles-ci, utilisez socket_last_error() / socket_get_option() à la place.
  • socket_get_status() reflète l'état du tampon et du délai d'attente au moment où vous l'appelez ; elle ne sonde pas activement le réseau, donc un eof à false ne garantit pas que le pair est toujours accessible.
  • Réinitialisez l'indicateur de délai en effectuant une autre lecture réussie — le tableau est recalculé à chaque appel.

Conclusion

La fonction socket_get_status() est un moyen léger d'inspecter l'état d'un socket de flux en PHP. Son champ le plus précieux est timed_out, qui vous permet de distinguer un délai d'attente de lecture d'une connexion fermée — ce que la valeur de retour de fgets() seule ne peut pas faire. Combinée avec eof, unread_bytes et les contrôles de délai et de blocage de stream_set_timeout() et stream_set_blocking(), elle vous donne les informations dont vous avez besoin pour gérer les connexions réseau de manière fiable.

Pratique

Pratique
Quel est le but de la fonction socket_get_status() en PHP ?
Quel est le but de la fonction socket_get_status() en PHP ?
Was this page helpful?