PHPerKaigi 2024

stream_socket_shutdown

(PHP 5 >= 5.2.1, PHP 7, PHP 8)

stream_socket_shutdownFecha uma conexão full-duplex

Descrição

stream_socket_shutdown(resource $stream, int $mode): bool

Fecha uma conexão full-duplex (parcialmente ou não).

Nota:

O buffer ou buffers associados podem ou não ser esvaziados.

Parâmetros

stream

Um fluxo aberto (aberto com stream_socket_client(), por exemplo)

mode

Uma das constantes a seguir: STREAM_SHUT_RD (desabilita recepções adicionais), STREAM_SHUT_WR (desabilita transmissões adicionais) ou STREAM_SHUT_RDWR (desabilita transmissões e recepções adicionais).

Valor Retornado

Retorna true em caso de sucesso ou false em caso de falha.

Exemplos

Exemplo #1 Um exemplo de stream_socket_shutdown()

<?php

$server
= stream_socket_server('tcp://127.0.0.1:1337');
$client = stream_socket_client('tcp://127.0.0.1:1337');

var_dump(fputs($client, "olá!!"));

stream_socket_shutdown($client, STREAM_SHUT_WR);
var_dump(fputs($client, "olá!!")); // agora não funciona

?>

O exemplo acima produzirá algo semelhante a:

int(5)

Notice: fputs(): send of 5 bytes failed with errno=32 Broken pipe in test.php on line 9
int(0)

Veja Também

  • fclose() - Fecha um ponteiro de arquivo aberto

add a note

User Contributed Notes 3 notes

up
5
Daniel J
3 years ago
Be wary of using stream_socket_shutdown with a TLS socket. The socket is closed without sending the "close_notify" message required by TLS protocol.

To correctly close a TLS socket, use fclose() instead, which internally calls OpenSSL's SSL_shutdown() function.
up
2
Anonymous
2 years ago
As Daniel J has pointed out, stream_socket_shutdown doesn't send the TLS close_notify message. In some instances, it's a preferred function over fclose (to trigger stream_select, for example).

To use this function correctly with TLS, use stream_socket_enable_crypto($fp, false); before shutting down the socket.
up
1
jgotti
11 years ago
Just a note to say that if you encounter problem closing some sockets using fclose in a multi client server, you should really give this one a try.

Spent a full day trying to resolve this issue using stream_socket_shutdown($clientStream,STREAM_SHUT_RDWR);
finally do the trick.
To Top