Skip to content

Instantly share code, notes, and snippets.

@sobstel
Last active January 21, 2021 17:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sobstel/6568526 to your computer and use it in GitHub Desktop.
Save sobstel/6568526 to your computer and use it in GitHub Desktop.
Non-blocking socket connection
<?php
function nonblock_socket_connect($ip, $port)
{
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!socket_set_nonblock($socket)) {
socket_error($socket);
}
$connected = @socket_connect($socket, $ip, $port);
if (!$connected) {
// http://php.net/manual/en/function.socket-connect.php#refsect1-function.socket-connect-returnvalues
// If the socket is non-blocking then socket_connect() function returns FALSE with an error Operation now in progress.
$in_progress = (strpos(socket_strerror(socket_last_error()), 'in progress') !== false);
if (!$in_progress) {
socket_error($socket);
}
}
return $socket;
}
function socket_error($socket)
{
$errno = socket_last_error($socket);
$errstr = socket_strerror($errno);
throw new Exception($errstr, $errno);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment