Sockets should be first shutdown and then closed.
<?php
// Sample: Closing sockets gracefully
socket_shutdown($sock, 2);
socket_close($sock);
?>
PHP - Manual: socket_shutdown
2024-12-22
(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
socket_shutdown — Shuts down a socket for receiving, sending, or both
The socket_shutdown() function allows you to stop
incoming, outgoing or all data (the default) from being sent through the
socket
注意:
The associated buffer, or buffers, may or may not be emptied.
socket
A Socket instance created with socket_create().
mode
The value of mode
can be one of the following:
0 |
Shutdown socket reading |
1 |
Shutdown socket writing |
2 |
Shutdown socket reading and writing |
成功时返回 true
, 或者在失败时返回 false
。
版本 | 说明 |
---|---|
8.0.0 |
现在 socket 是 Socket 实例,
之前是 resource。
|
Sockets should be first shutdown and then closed.
<?php
// Sample: Closing sockets gracefully
socket_shutdown($sock, 2);
socket_close($sock);
?>
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.
<explain>
In this case, the TCP client is gracefully disconnected from the server
<?php
define('BUF_SIZE',10);
// create for tcp
$sock = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
socket_bind($sock, '127.0.0.1',5200);
socket_listen($sock,1024);
$fp = fopen('./socket_shutdown.php','rb');
$clnt_sock = socket_accept($sock);
while(!feof($fp)) {
$str = fread($fp,BUF_SIZE);
socket_write($clnt_sock,$str,BUF_SIZE);
}
$eof = "\n";
socket_write($clnt_sock,$eof,strlen($eof));
//disconnect output stream(断开输入流)
socket_shutdown($clnt_sock,1);
$ret = socket_read($clnt_sock, 100);
printf("Message from client:%s\n",$ret);
socket_close($clnt_sock);
socket_close($sock);
?>
<?php
// for tcp-client
$clnt_sock = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
socket_connect($clnt_sock, '127.0.0.1', 5200);
while (($cnt= @socket_read($clnt_sock, 10,PHP_NORMAL_READ)) !==false) {
file_put_contents('./receive.data',$cnt,FILE_APPEND);
}
print "receive file data".PHP_EOL;
socket_write($clnt_sock, "Tank you");
socket_close($clnt_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.
官方地址:https://www.php.net/manual/en/function.socket-shutdown.php