Реализация функции «кто онлайн в чате» приводит к зависанию сервера

130
03 апреля 2019, 21:50

Простейшая реализация чата со списком юзеров онлайн. Один SSE (стрим) выдаёт появившиеся новые строки в txt-файле, а другой скрипт с SSE отвечает за список присутствующих юзеров. И вот с ним совсем беда. Если пару раз обновить страницу, в которой слушается этот скрипт, сервер зависает минут на 15. Если ещё раз так поглумится над ним, перестаёт отвечать перманентно. Такое впечатление, будто при обновлении/закрытии страницы скрипт продолжает вертеться. Или нагрузка слишком большая... Просьба глянуть, чего тут может быть не так.

<?php
ignore_user_abort(true);
header('Content-Type: text/event-stream');
header("Cache-Control: no-cache");
$hash_old = "";
session_name(' myApp' ); # получаем юзернейм обратившегося
session_start();
$userName = $_SESSION['userName'];
session_write_close();
mysql_select_db('mydb', $db);
# Пока обратившийся держит коннект, пишем каждые 20 секунд
# в БД время последней активности и вторым запросом выводим тех,
# чьё время последней активности менее 20 секунд назад.
while(!connection_status() !== 0){
    $query = "UPDATE `user` SET ping = NOW() WHERE name = '".$userName."'";
    $result = mysql_query ( $query );
    $query = "SELECT name FROM `user` WHERE ping >= DATE_SUB(NOW(), INTERVAL 19 second) ORDER BY ping DESC";
    $result = mysql_query ( $query );
    $names = [];
    while($row = mysql_fetch_array($result))
        array_push($names, $row['name']);
    if (count($names) > 0) {
        $names_str = implode(",", $names);
        # если хэш строки с именами не равен хэшу предыдущей итерации...
        # Не спрашивайте, почему я просто не сравниваю строки
        $hash_new = md5($names_str); 
        if ($hash_new !== $hash_old) {
            $response = ["users" => $names_str];
            $hash_old = $hash_new;
            # выводим json с именами
            echo "data: ".json_encode($response)."\n\n";
        }
    }
ob_flush();
flush();
sleep(20); # делаем паузу
}
?>
READ ALSO
PHP RAR ARCHIVE добавление файла

PHP RAR ARCHIVE добавление файла

Нужно провести манипуляции с архивами, то есть добавить в них файлыС zip понятно - стандартная встроенная библиотека в php уже протестированна

150
Почему не работает Blockchain?

Почему не работает Blockchain?

Доброго времени суток!

177
Drupal 8 в Firefox Код ошибки: SEC_ERROR_UNKNOWN_ISSUER

Drupal 8 в Firefox Код ошибки: SEC_ERROR_UNKNOWN_ISSUER

Знакомство с Drupal началось с проблемУстановлен Openserver 5

162
Как убрать язык с которого переходишь? request()-&gt;path();

Как убрать язык с которого переходишь? request()->path();

Как получить get curent url только конец ? http://siteru/ru/newpage

114