Создание кто в сети из фреймворка Laravel (Вопрос) - PullRequest
0 голосов
/ 28 февраля 2019

Я не уверен, выполнил ли я свою идею, я хочу создать пользовательскую страницу в Интернете с помощью Laravel Framework, мне интересно, правильный ли метод, который я использовал для введения пользователей в базу данных, корректен и поэтому удаляется послевремя превышает лимит.

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Route;
use Illuminate\Http\Request;

class Automatism {

    public function handle($request, Closure $next) {
        DB::table('users_online')->updateOrInsert(
          ['user-ip' => \Request::getClientIp(true)],
          [
            'user-viewing-url' => Route::getFacadeRoot()->current()->uri(),
            'user-ip' => \Request::getClientIp(true),
            'timestamps' => now()
          ]
        );

        DB::table('users_online')->where('timestamps', '<', 'now() - INTERVAL 5 MINUTE')->delete();
        return $next($request);
    }
}

Затем рядом с этим кодом я хотел сделать то же самое для пользователей, которые были на сайте в течение 24 часов.

1 Ответ

0 голосов
/ 28 февраля 2019

Я сделал промежуточное ПО для отслеживания активности пользователей один раз, вот оно, может быть, оно может дать вам идеи:

public function handle($request, Closure $next)
    {
        $this->request = $request;
        if(Auth::check()) {
            Cache::put('user-is-online-' . Auth::user()->id, true, Carbon::now()->addMinutes(5));
            $this->storeDailyUserActivity();
        }

        return $next($request);
    }

    public function storeDailyUserActivity(){
        $daily_active_user = [];
        if(Cache::has('daily_active_user')){
            $daily_active_user = Cache::get('daily_active_user');
            if(!is_array($daily_active_user)){
                Cache::forget('daily_active_user');
                $this->storeDailyUserActivity();
                return;
            }
            $daily_active_user['cache_old_date'] = $daily_active_user['cache_date'] ?? 'err_no_cache_date'; //debug only
        }
        $daily_active_user[Auth::user()->id] = Carbon::now();
        $daily_active_user['cache_date'] = Carbon::now()->toTimeString() . ' - ' . $this->request->url(); //debug only
        Cache::forever('daily_active_user', $daily_active_user);
    }
  • Он использует Cache для предотвращения выполнения запросов к БД по каждому запросу (если вы действительнонеобходимо сохранить это в вашей БД, вам нужно будет адаптировать).Примечание: вам понадобится драйвер кеша, который поддерживает ключи кеша (проверьте Laravel doc).
  • Он хранит уникальный ключ кеша для каждого пользователя, поэтому позже в вашем коде вы можете проверить этот же ключ для конкретногопользователь (например: если этот пользователь был активен в течение последних 5 минут)
  • Он также сохраняет дату последнего действия всех пользователей в массиве.Таким образом, вы можете зацикливаться на нем, находить пользователей и когда они были активны в последний раз (например: отображать всех пользователей с активностью за последние 2 часа).
  • Это старый фрагмент кода, который можно улучшить.Помощники для проверки этих значений кэша (например: isUserActiveInLastMinutes($minutes = 5)) могут быть легко созданы.

В случае, если вам действительно нужно сохранить его в вашей БД, я бы сделал:

  • добавить столбец отметки времени last_activity для пользователей (или, например, отношение oneToOne между таблицей пользователей и таблицей user_activity)
  • обновлять этот last_activity при каждом запросе пользователя (я бы по крайней мере рекомендовал использовать5-минутный кэш, чтобы предотвратить добавление запроса БД на каждый запрос пользователя)
  • затем вы можете красноречиво запросить «всех пользователей с last_activity> Carbon :: now () -> subMinutes (5)»
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...