Can a PHP script detect if a socket has been closed?

php socket
php close connection and continue executing
php fsockopen
php ignore_user_abort
php close socket
php connection_status
php test socket connection

How can a PHP script detect if a socket has been closed by the remote party?

From socket_read():

socket_read() returns the data as a string on success, or FALSE on error 
(including if the remote host has closed the connection). The error code can 
be retrieved with socket_last_error(). This code may be passed to 
socket_strerror() to get a textual representation of the error.

This is the fairly standard approach to detecting if a socket is closed in most languages. I don't believe PHP offers a direct event-style notification (except perhaps something in PEAR).

socket_get_status - Manual, connection_aborted — Check whether client disconnected ignore_user_abort () - Set whether a client disconnect should abort script execution A trick to detecting if a connection is closed without having to send data that will By doing this you are potentially increasing the data sent to the user with no gain to the user. Parameters. socket. A valid socket resource created with socket_create() or socket_accept().. length. The maximum number of bytes read is specified by the length parameter. . Otherwise you can use \r, , or \0 to end reading (depending on the type parameter, see belo

connection_aborted - Manual, Sometimes it is handy to always have your scripts run to completion even if will detect that the connection has been aborted and the shutdown function is called. was modified so that it would not automatically close the users connection. Socket.readyState. The readonly attribute readyState represents the state of the connection. It can have the following values − A value of 0 indicates that the connection has not yet been established. A value of 1 indicates that the connection is established and communication is possible.

fread($socket) returns empty string, instantly, without waiting for the socket to timeout.

(No, this is not a real answer, but this is the hackish solution I have in place in my code ATM. This behaviour might also be windows-specific.)

Connection handling - Manual, This is useful for polling. If tv_sec is NULL (no timeout), socket_select() can block indefinitely. tv_usec close the listening socket Run it in the shell with php < name of file> and test in in the browser with <server address>:8080/test <?php What do WebSockets Replace? Websockets can replace long-polling. This is an interesting concept; the client sends a request to the server – now, rather than the server responding with data it may not have, it essentially keeps the connection open until the fresh, up-to-date data is ready to be sent - the client next receives this, and sends another request.

socket_select - Manual, The error code can be retrieved with socket_last_error(). This code may be of the error. Note: socket_read() returns a zero length string ("") when there is no more data to read. you can detect closed connection by checking for '' (not FALSE as stated i manual) Allow the script to hang around waiting for connections. */ PHP: 5.1.4 Summary: close() does not relinquish socket immediately. With the BSD socket implementation (which is the socket interface used by PHP), a socket_close() may close the socket, but there may yet be data to send. Until the data is sent, the port will not be available.

socket_read - Manual, If an error occurs, if the connection is reset, or if no data is available, buf will be set to NULL . len So I had just to check return value of socket_recv. this statuses are wrong and swapped, closed socket must be with "FALSE" The int flag set to 2 apparently reset the file position pointer so what I was reading was the first� This means for example: if your buffer pool size is set to innodb_buffer_pool_size=16G and your innodb_log_files_in_group setting is still set to the recommended default of 2 files (innodb_log_files_in_group=2), then your innodb_log_file_size should be set to 2G.

socket_recv - Manual, For Unix domain sockets, the target portion should point to the socket file on the On success a stream resource is returned which may be used together with the UDP sockets will sometimes appear to have opened without an error, even if the If you only need to check a stream for data, you can use stream_get_content� The Socket.Connected property will tell you whether a socket thinks it’s connected. It actually reflects the status of the last send/receive operation performed on the socket. If the socket has been closed by your own actions (disposing the socket, calling methods to disconnect), Socket.Connected will return false.

Comments
  • @tntu: This is incorrect. "" is what is returned if there is no data (including non-blocking mode). This is separate and different to false.
  • Well in blocking mode wouldn't it block until it receives something instead of JUST CHECKING if the connection is closed or not?
  • This is standard behaviour in most languages/platforms, not just PHP/Windows.
  • What gets returned if I call fread($socket) when the connection is open?