socket_shutdown
(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:possible values for mode
0
Shutdown socket reading 1
Shutdown socket writing 2
Shutdown socket reading and writing
返回值
成功时返回 true
, 或者在失败时返回 false
。
更新日志
版本 | 说明 |
---|---|
8.0.0 |
现在 socket 是 Socket 实例,
之前是 resource。
|

User Contributed Notes 4 notes
ludvig dot ericson at gmail dot com ¶
16 years ago
Sockets should be first shutdown and then closed.
<?php
// Sample: Closing sockets gracefully
socket_shutdown($sock, 2);
socket_close($sock);
?>
richard dot thomas at psysolutions dot com ¶
16 years ago
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.
renmengyang567 at gmail dot com ¶
3 years ago
<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);
?>
recycling dot sp dot am at gmail dot com ¶
11 years ago
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.
备份地址:http://www.lvesu.com/blog/php/function.socket-shutdown.php