Простейшая реализация чата со списком юзеров онлайн. Один 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); # делаем паузу
}
?>
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Нужно провести манипуляции с архивами, то есть добавить в них файлыС zip понятно - стандартная встроенная библиотека в php уже протестированна
Знакомство с Drupal началось с проблемУстановлен Openserver 5
Как получить get curent url только конец ? http://siteru/ru/newpage