Здравствуйте. Имеется клиент сокет написанный на PHP, при обрыве соединения между клиентом и сервером (Например, если вытащить сетевой провод) зависает процесс ЧТЕНИЯ (socket_read) и не выводится ошибка о потери соединения.
Как отлавливать разрывы сети на стороне клиента в PHP и просто пропускать выполнения функции socket_read?
Код соединения:
public function connect($hostname, $socket_port) {
if(($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
return false;
}
$timeout = 3;
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0)); //READ TIMEOUT
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec' => $timeout, 'usec' => 0)); //WRITE TIMEOUT
socket_set_nonblock($socket);
$time = time();
while (!@socket_connect($socket, $hostname, $socket_port)) {
$err = socket_last_error($socket);
// success!
if($err === 56) {
//print('connected ok');
break;
}
if ((time() - $time) >= $timeout) {
socket_close($socket);
//print('timeout reached!');
return false;
}
usleep(250000);
}
socket_set_block($socket);
$out = $this->read($socket);
if ($out == false) {
return false;
}
return $socket;
}
Код чтения:
public function read($link){
socket_set_block($link);
$out = "";
if($link){
while (true){
$line = socket_read($link, 1024, PHP_NORMAL_READ);
if($line === false) break;
$out .= $line;
if (mb_stripos ($line, "\n") !== false or $line == "") break;
}
}
return $out;
}