Sockets should be first shutdown and then closed.
<?php
// Sample: Closing sockets gracefully
socket_shutdown($sock, 2);
socket_close($sock);
?>
(PHP 4 >= 4.1.0, PHP 5, PHP 7)
socket_shutdown — Shuts down a socket for receiving, sending, or both
$socket
[, int $how
= 2
] )
The socket_shutdown() function allows you to stop
incoming, outgoing or all data (the default) from being sent through the
socket
Note:
The associated buffer, or buffers, may or may not be emptied.
socket
A valid socket resource created with socket_create().
how
The value of how
can be one of the following:
0 | Shutdown socket reading |
1 | Shutdown socket writing |
2 | Shutdown socket reading and writing |
Returns TRUE
on success or FALSE
on failure.
Sockets should be first shutdown and then closed.
<?php
// Sample: Closing sockets gracefully
socket_shutdown($sock, 2);
socket_close($sock);
?>
Shutdown and SOL_TCP:
<?php
$a= socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_shutdown($a, 2)
?>
PHP Warning: socket_shutdown(): unable to shutdown socket [107]: Transport endpoint is not connected
Shutdown and SOL_UDP:
<?php
$a= socket_create(AF_INET, SOCK_STREAM, SOL_UDP);
socket_shutdown($a, 2)
?>
PHP Warning: socket_shutdown(): unable to shutdown socket [107]: Transport endpoint is not connected
Conclusion: if you are not actually connected, shutdown will fails with socket_error = 107, Transport endpoint is not connected. This is true for both TPC and UDP connection (which is suprising, UDP being a connectionless protocol). This is true no matter the value set for the how parameter.
That is not a good example of a graceful shutdown. One should close the sending side of the socket and continue to read until the remote end closes its sending connection.