stream_socket_shutdown în PHP

Socket-uri PHP 5.2.1+

Închide doar o direcție a unei conexiuni (scrierea, citirea sau ambele), fără să elibereze stream-ul.

Sintaxă
stream_socket_shutdown($stream, int $mode): bool

Ce face stream_socket_shutdown

Uneori clientul trebuie să spună „am terminat de trimis” și să aștepte totuși răspunsul. stream_socket_shutdown($s, STREAM_SHUT_WR) închide doar scrierea: celălalt capăt vede finalul datelor (feof devine true), dar tu poți citi în continuare.

STREAM_SHUT_RD oprește citirea, iar STREAM_SHUT_RDWR pe amândouă. Spre deosebire de fclose, stream-ul rămâne valid până îl închizi.

Parametri

Parametru Descriere
$stream Socket-ul conectat.
$mode STREAM_SHUT_RD, STREAM_SHUT_WR sau STREAM_SHUT_RDWR.

Ce returnează

true la succes, false la eroare.

Exemple

Exemplul 1: „Am terminat de trimis”, apoi răspunsul

Serverul citește până la final cu stream_get_contents. Fără shutdown, ar aștepta la nesfârșit date noi.

<?php
[$client, $server] = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);

fwrite($client, "Ana\nIon\nMaria\n");
stream_socket_shutdown($client, STREAM_SHUT_WR);

$nume = stream_get_contents($server);
fwrite($server, "Am primit " . substr_count($nume, "\n") . " nume\n");

echo fgets($client);

Rezultat

Am primit 3 nume

Greșeli frecvente

  • Scrii în socket după STREAM_SHUT_WR. Scrierea eșuează. Trimite tot ce ai de trimis înainte de shutdown.

Comenzi înrudite

  • stream_socket_pair: Creează două socket-uri legate între ele: ce scrii într-unul se citește din celălalt, în ambele sensuri.
  • stream_socket_client: Deschide o conexiune către un server dată ca adresă completă (tcp://, udp://, tls://, unix://) și o returnează ca stream.
  • fopen / fclose: Deschide un fișier pentru citire sau scriere și returnează o resursă; fclose îl închide.