iNfantry
Новичок
Всем привет, подскажите нормальный человеческий способ держать установленное соединение, и в случае если происходит разрыв по какой-то причине, то определить что он произошел. Конкретно в моем случае речь идет о xmpp(jabber)-клиенте, всё работает нормально, подключение, прием/отправка сообщений, авторизация и тд, вопрос только в том, что соединение через какое-то время рвется и я не знаю как это отследить.
PHP:
function getxml($stream)
{
sleep(1); // перед получением информации дадим паузу, чтобы сервер успел отдать информацию
$xml = '';
// запрашивать данные 1600 раз, но не более 15 пустых строк
$empty_line = 0;
for ($i=0; $i<1600; $i++) {
$line = fread($stream, 2048);
if (strlen($line) == 0) {
$empty_line++;
if ($empty_line > 15) {
break;
}
}
else {
$xml .= $line;
}
}
if (!$xml) {
return false;
}
return $xml;
}
// устанавливаем соединение с сервером
$stream = fsockopen($host, $port, $errorno, $errorstr, 10);
// эти настройки необходимы, чтобы при получении данных из потока не было зависания.
// иначе при обнаружении пустой строки php зависнет в длительном ожидании
stream_set_blocking($stream, 0);
stream_set_timeout($stream, 3600*24);
... //отправка и получение всех необходимых данных для авторизации и выхода в онлайн
while (true)
{
sleep(3); // ставим паузу в 3 секунды, чтобы не создавать большую нагрузку на php
$xmlin = getxml($stream); // и раз в 3 секунды идет сбор данных из потока. тут будут приходить сообщения, информация о смене статусов ваших контактов и т.д.
if (strlen($xmlin))
{
... //обрабатываем входящие пакеты
//здесь надо както узнать, не произошел ли разрыв связи
}
}