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 deshutdown.
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.