Laravel - Получить уникальное количество посетителей сайта - PullRequest
4 голосов
/ 24 января 2020

Я хочу собрать уникальное количество посетителей на моем сайте и сохранить их в базе данных. Даже когда кто-то без учетной записи получает доступ к сайту, количество посетителей увеличивается. Как я могу выполнить sh это?

Я знаю, что должен получить IP-адрес пользователя или что-то в этом духе, но я не знаю, как получить IP-адрес пользователя без учетной записи, когда загрузка страниц

В настоящее время у меня есть эта таблица БД

Visitors
 - ip
 - date_visited

Маршрут

Route::get('/', function () {
    $ip = Request::ip();
    return view('welcome', compact('ip'));
});

Ответы [ 4 ]

4 голосов
/ 24 января 2020

Попробуйте использовать Request::ip(), чтобы получить IP;

$ip = Request::ip();

Для Laravel 5.4 +:

$ip = $request->ip();
// or
$ip = request()->ip();

И я думаю, что вы можете использовать middleware и redis , чтобы рассчитать этот счет, это уменьшит давление БД.

1 голос
/ 24 января 2020

Лучше использовать комбинацию user_agent и ip для получения более точных результатов, многие пользователи могут иметь один и тот же IP-адрес, но обычно имеют разные пользовательские агенты:

request()->userAgent();
request()->ip();

В качестве альтернативы, если вы используете web middleware (не api), Laravel запускает сеанс для каждого клиента. Вы можете изменить свой драйвер сеанса и использовать database вместо значения по умолчанию file.

Таким образом Laravel будет хранить запись для каждого клиента в таблице sessions, содержащую всю необходимую информацию и даже больше:

Schema::create('sessions', function ($table) {
    $table->string('id')->unique();
    $table->unsignedInteger('user_id')->nullable();
    $table->string('ip_address', 45)->nullable();
    $table->text('user_agent')->nullable();
    $table->text('payload');
    $table->integer('last_activity');
});

Как видите, есть ip_address, user_agent и last_activity. user_id будет null для гостевых пользователей и имеет значение для аутентифицированных пользователей.

См. Laravel документы , чтобы настроить драйвер сеанса для использования database.

1 голос
/ 24 января 2020

Одним из хороших решений в этом случае является создание middleware, который отслеживает всех ваших пользователей. Мы можем поместить любой вид бизнес-логики c в middleware.

<?php

namespace App\Http\Middleware;

use Closure;

class TrackUser
{
    public function handle($request, Closure $next)
    {
        /* You can store your user data with model, db or whatever...
           Here I use a repository that contains all my model queries. */
        $repository = resolve('App\Repositories\TrackUserRepository');

        $repository->addUser([
            'ip'   => request()->ip(),
            'date' => now(),
        ]);

        return $next($request);
    }
}

Затем добавить middleware к App\Kernel.php:

  • Добавить его в $middleware, если вы хотите, чтобы это было глобальное промежуточное ПО, которое выполняется при каждом запросе.
  • Добавьте его в $middlewareGroups, если вы хотите, чтобы оно выполнялось только на каждом web -руте.
  • Добавьте его к $routeMiddleware, если вы хотите указать в routes/web.php, когда промежуточное программное обеспечение должно применяться.

Вам также следует рассмотреть возможность перемещения любых логи c в middleware внутри "try catch "- заявление, оно сводит к минимуму риск того, что ваш пользователь будет остановлен из-за любых ошибок, вызванных кодом отслеживания.

try {
    $repository = resolve('App\Repositories\TrackUserRepository');

    $repository->addUser([
        'ip'   => request()->ip(),
        'date' => now(),
    ]);
} catch (\Exception $e) {
    // Do nothing or maybe log error
}

return $next($request);
0 голосов
/ 24 января 2020

Как @tsaiKoga упомянул, как вы получите IP-адрес.

создайте новую таблицу для IP-адреса и отметки времени их посещений.

проверьте, не существует ли IP-адрес ИЛИ time()-saved_timestamp > 60*60*24 ( на 1 день), отредактируйте метку времени IP на time () (значит сейчас) и увеличьте ваш обзор, иначе ничего не делайте!

Более того, вы можете получить IP по $_SERVER['REMOTE_ADDR']

Здесь упоминаются другие способы получения IP. { ссылка }

Просмотрите комментарий, который возвращает 127.0.0.1

Пожалуйста, попробуйте: -

request()->server('SERVER_ADDR');

ИЛИ вы можете использовать

$_SERVER['SERVER_ADDR'];

ИЛИ

$_SERVER['REMOTE_ADDR']

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...