Всем доброго времени суток. Пожалуйста, помоги разобраться с проблемой. Я написал небольшой чат с использованием WebSockets и самописным сервером на php без использования phpDaemon, Libevent и прочих подобных вещей. Всё работает как надо, кроме одной детали: остаётся много зависших коннектов. При закрытии браузера или вкладки клиент отключается правильно, но если у пользователя, например, пропадает соединение с интернетом, то коннект остаётся висеть на сервере ещё ровно 20 минут. Никак не могу понять в чем проблема. Возможно в функции stream_socket_accept? Я перепробовал все возможные значения таймаута, но ничего не меняется. Может есть какая-то настройка PHP, о которой я не знаю? Вот кусок кода сервера: Код (PHP): $socket = stream_socket_server("tcp://0.0.0.0:8080", $errno, $errstr); $this->stop_server = false; $this->connects = array(); $this->sites = array(); while($this->stop_server == false){ //Формируем массив прослушиваемых сокетов $read = $this->connects; $read[]= $socket; $write = $except = null; if(!stream_select($read, $write, $except, null)){ break; } if(in_array($socket, $read)){ if(($connect = stream_socket_accept($socket, -1)) && $info = $this->handshake($connect)){ $this->connects[] = $connect; $this->on_open($connect, $info); } unset($read[array_search($socket, $read)]); } //Обрабатываем все соединения foreach($read as $connect){ $data = fread($connect, 1024); $disconnect = false; if(!$data || strlen($data) === 0){ $disconnect = true; } else { $data = $this->decode($data); if($data['type'] == 'close'){ $disconnect = true; } } if($disconnect == true){ //Соединение было закрыто $this->disconnect_client($connect); continue; } } } PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
На сокет можно ставить таймаут чтения данных и еще некоторые таймауты Код (Text): $timeout = array('sec'=>1,'usec'=>500000); socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,$timeout); http://php.ru/manual/function.socket-set-option.html
Не получается. Эта функция работает только с socket_create, а у меня stream_socket_server. Или я что-то не так понял? Выдаёт вот это: Warning: socket_set_option(): supplied resource is not a valid Socket resource
Точно. Зато у функции stream_select(), которую ты используешь, последние необязательные параметры это таймаут.
У stream_select ставил таймаут и при этом сервер останавливается. А мне нужно чтобы отключался только один зависший коннект. stream_set_timeout тоже не работает
Сервер не может знать, что клиент завис. Когда клиент зависает, он ничего не сообщает серверу, следовательно сервер не сможет узнать, что он завис. Поэтому единственным верным решением является таймаут. Например ты можешь поставить таймаут в 5 секунд, и при разработке клиента позаботится, чтобы он посылал хоть что нибудь на каждые 4 секунды.
В том то и проблема, что у меня не получается поставить таймаут. Я что только не пробовал.. Соединение рвется только через 20 минут. Нигде не могу уменьшить это значение хотябы до 1 минуты