Когда вы устанавливаете свой сокет неблокирующим, вы не можете ожидать, что результат socket_connect()
вернет TRUE, если он подключен, или FALSE, если нет.
Страница руководства PHP :
Если сокет не является блокирующим, то эта функция возвращает FALSE с ошибкой. Выполняется операция.
Это верно для любого языка. Вы должны установить сокет «блокировка» или опрашивать / выбирать в своем файловом дескрипторе, прежде чем проверять, правильно ли вы подключены или нет.
В PHP вы можете вызвать функцию socket_connect()
через небольшой промежуток времени, чтобы проверить, возвращает ли она значение true, false или дождаться истечения времени ожидания.
Попробуйте этот код [ EDITED , чтобы исправить небольшую ошибку в процедуре тайм-аута]:
<?php
$service_port = 2002;
$address = '127.0.0.1';
$timeout = 3;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($socket);
$error = NULL;
$attempts = 0;
$timeout *= 1000; // adjust because we sleeping in 1 millisecond increments
$connected = FALSE;
while (!($connected = @socket_connect($socket, $address, $service_port)) && ($attempts++ < $timeout)) {
$error = socket_last_error();
if ($error != SOCKET_EINPROGRESS && $error != SOCKET_EALREADY) {
echo "Error Connecting Socket: ".socket_strerror($error) . "\n";
socket_close($socket);
return NULL;
}
usleep(1000);
}
if (!$connected) {
echo "Error Connecting Socket: Connect Timed Out After " . $timeout/1000 . " seconds. ".socket_strerror(socket_last_error()) . "\n";
socket_close($socket);
return NULL;
}
?>