Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Добрый день.Создал Статусы пользователей онлайн и офлайн.Но проблема в том что не знаю как написать чтобы чистился кэш пользователей. В папке сохраняется кэш пользователей. И после удаления кэша онлайн сменяется на офлаййн как написать программу кэш для статуса.
Логику хочу такую написать - когда пользователь выходит с сайта - то чиститься кэш статус -офлайн.
Мой код.
Профиль пользователя.
@if(Cache::has('user-online' . $user->id))
<span class="text-green-500">Online</span>
<style> .text-green-500{
color: yellowgreen;}</style>
@else
<span class="text-gray-500">Offline</span>
@endif
</td>
<td>
@if($user->last_seen != null)
{{\Carbon\Carbon::parse($user->last_seen)->diffForHumans() }}
@else
No data
@endif
</td>
Кнопка Логаута. Выход.
<a href="{{ url('/logout') }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
Logout
</a>
<form id="logout-form" action="{{ url('/logout') }}" method="POST" style="display: none;">
{{ csrf_field() }}
</form>
Не в сети
Кеш по определению нечто необязательное, может отсутствовать в любой момент. Поэтому применять его таким образом нелогично.
Статус онлайн пользователя определяют через сохранение отметки о его последнем визите. Например в самой таблице пользователей или в специальной таблице. И считаем что пользователь онлайн если он был здесь не более 10 минут назад, к примеру.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Можете подсказать как написать это?
Не в сети
В моделе вот что у меня прописано 1 минута
А в еонтроллере более глубже написанно что по минутам часам и лням месяцам и году
Он счииает сколько человека не было онлайн в бд такде есть запись Ласт син.
Не в сети
public function handle($request, Closure $next)
{
if (Auth::check()) {
$expiresAt = Carbon::now()->addMinutes(1); // keep online for 1 min
Cache::put('user-is-online-' . Auth::user()->id, true, $expiresAt);
// last seen
User::where('id', Auth::user()->id)->update(['last_seen' => (new \DateTime())->format("Y-m-d H:i:s")]);
}
return $next($request);
}
}
Не в сети
Сохранение отметки есть в бд
Не в сети
"Last seen" читается как "Последний раз видели". Сохраняй просто now(). Время последнего визита пользователя не зависит от величины таймаута для вычисления кто онлайн. Логика!!!
А в контроллере вычисляй время назад, то есть отнимай от текущего. Типа
User::where('last_seen', '>', now()->subMinutes(ONLINE_TIMEOUT))->count()
Еще раз: кеш здесь не нужен. Кеш кроме того что необязателен, еще не имеет смысла там, где постоянно происходит обновление. Он оптимизирует ситуацию когда редко пишется и часто читается. И при отсутствии нужных данных в кеше приложение должно выдавать те же результаты! (только может быть немного медленнее) Если у тебя не так, то это логическая ошибка.
Изменено artoodetoo (30.03.2023 09:57:24)
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
@if(Cache::has('user-online' . $user->id))
можно заменить на
@if( $user->last_seen->greaterThan(now()->subMinutes(ONLINE_TIMEOUT)) )
будет также работать ->gt(x) : https://carbon.nesbot.com/docs/#api-comparison
да и просто сравнение ">", но это вроде бы недокументированная фича PHP
Здесь я подразумеваю что last_seen у тебя автоматически тайпкастится в Carbon. Потому что так принято в Laravel
— This is the way. May the force be with you.
Изменено artoodetoo (30.03.2023 10:12:38)
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Страницы 1