Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 27.03.2023 17:18:09

Viktor92
Откуда: Москва
Сообщений: 26

Кэш Статус Онлайн и офлайн. Ларавель 7

Добрый день.Создал Статусы пользователей онлайн и офлайн.Но проблема в том что не знаю как написать чтобы чистился кэш пользователей. В папке сохраняется кэш пользователей. И после удаления кэша онлайн сменяется на офлаййн как написать программу кэш для статуса.

Логику хочу такую написать - когда пользователь выходит с сайта - то чиститься кэш статус -офлайн.

Мой код.

Профиль пользователя.


@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>

Не в сети

#2 28.03.2023 11:03:26

Re: Кэш Статус Онлайн и офлайн. Ларавель 7

Кеш по определению нечто необязательное, может отсутствовать в любой момент. Поэтому применять его таким образом нелогично.

Статус онлайн пользователя определяют через сохранение отметки о его последнем визите. Например в самой таблице пользователей или в специальной таблице. И считаем что пользователь онлайн если он был здесь не более 10 минут назад, к примеру.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#3 28.03.2023 14:58:58

Viktor92
Откуда: Москва
Сообщений: 26

Re: Кэш Статус Онлайн и офлайн. Ларавель 7

Можете подсказать как написать это?

Не в сети

#4 28.03.2023 16:02:12

Viktor92
Откуда: Москва
Сообщений: 26

Re: Кэш Статус Онлайн и офлайн. Ларавель 7

В моделе вот что у меня прописано 1 минута
А в еонтроллере более глубже написанно что по минутам часам и лням месяцам и году
Он счииает сколько человека не было онлайн в бд такде есть запись Ласт син.

Не в сети

#5 28.03.2023 16:02:30

Viktor92
Откуда: Москва
Сообщений: 26

Re: Кэш Статус Онлайн и офлайн. Ларавель 7

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);
    }
}

Не в сети

#6 28.03.2023 16:03:09

Viktor92
Откуда: Москва
Сообщений: 26

Re: Кэш Статус Онлайн и офлайн. Ларавель 7

Сохранение отметки есть в бд

Не в сети

#7 30.03.2023 09:36:01

Re: Кэш Статус Онлайн и офлайн. Ларавель 7

"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.

Не в сети

#8 30.03.2023 09:54:22

Re: Кэш Статус Онлайн и офлайн. Ларавель 7

@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 wink

— 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.

Не в сети

Подвал раздела