Laravel - 获取网站唯一访问者数量

我想在我的网站上收集唯一数量的访问者并将它们存储在数据库中。即使没有帐户的人访问该网站,访问者数量也会增加。我怎样才能做到这一点?


我知道我必须获取用户的 IP 地址或类似的东西,但我不知道如何在页面加载时获取没有帐户的用户的 IP 地址


目前我有这个数据库表


Visitors

 - ip

 - date_visited

路线


Route::get('/', function () {

    $ip = Request::ip();

    return view('welcome', compact('ip'));

});


呼啦一阵风
浏览 147回答 4
4回答

侃侃尔雅

尝试使用Request::ip()获取ip;$ip = Request::ip();对于 Laravel 5.4 +:$ip = $request->ip();// or$ip = request()->ip();而且我认为你可以使用中间件和redis来计算这个计数,这样可以减少db的压力。

守候你守候我

在这种情况下,一个好的解决方案是创建一个middleware跟踪所有用户的。我们可以将任何类型的业务逻辑放在middleware.<?phpnamespace App\Http\Middleware;use Closure;class TrackUser{&nbsp; &nbsp; public function handle($request, Closure $next)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; /* You can store your user data with model, db or whatever...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Here I use a repository that contains all my model queries. */&nbsp; &nbsp; &nbsp; &nbsp; $repository = resolve('App\Repositories\TrackUserRepository');&nbsp; &nbsp; &nbsp; &nbsp; $repository->addUser([&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'ip'&nbsp; &nbsp;=> request()->ip(),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'date' => now(),&nbsp; &nbsp; &nbsp; &nbsp; ]);&nbsp; &nbsp; &nbsp; &nbsp; return $next($request);&nbsp; &nbsp; }}然后添加middleware到App\Kernel.php:$middleware如果您希望它成为在每个请求上运行的全局中间件,请将其添加到。$middlewareGroups如果您希望它仅在每个web-route上运行,请将其添加到。$routeMiddleware如果您想指定routes/web.php何时应用中间件,请将其添加到。您还应该考虑在middleware“&nbsp;try&nbsp;catch”-语句中移动任何逻辑,它将您的用户因“跟踪”-代码引起的任何错误而停止的风险降到最低。try {&nbsp; &nbsp; $repository = resolve('App\Repositories\TrackUserRepository');&nbsp; &nbsp; $repository->addUser([&nbsp; &nbsp; &nbsp; &nbsp; 'ip'&nbsp; &nbsp;=> request()->ip(),&nbsp; &nbsp; &nbsp; &nbsp; 'date' => now(),&nbsp; &nbsp; ]);} catch (\Exception $e) {&nbsp; &nbsp; // Do nothing or maybe log error}return $next($request);

叮当猫咪

最好使用组合user_agent并ip获得更准确的结果,许多用户可能具有相同的IP但通常具有不同的用户代理:request()->userAgent();request()->ip();或者,如果你使用web中间件(不是api),Laravel 会为每个客户端启动一个会话。您可以更改会话驱动程序并使用database而不是 default file。这样,Laravel 将为每个客户端存储一条记录,sessions其中包含您需要的所有信息,甚至更多信息:Schema::create('sessions', function ($table) {&nbsp; &nbsp; $table->string('id')->unique();&nbsp; &nbsp; $table->unsignedInteger('user_id')->nullable();&nbsp; &nbsp; $table->string('ip_address', 45)->nullable();&nbsp; &nbsp; $table->text('user_agent')->nullable();&nbsp; &nbsp; $table->text('payload');&nbsp; &nbsp; $table->integer('last_activity');});如您所见,ip_address有user_agent和last_activity。这user_id将null适用于来宾用户,并且对经过身份验证的用户具有价值。请参阅Laravel 文档来配置您的会话驱动程序以使用database.

慕的地6264312

您将如何获得 IP 地址。为 ip 地址及其访问时间戳创建一个新表。检查如果 IP 不存在或time()-saved_timestamp > 60*60*24(1 天),将 IP 的时间戳编辑为 time()(表示现在)并增加您的视图,否则什么都不做!此外,您可以通过以下方式获得 IP$_SERVER['REMOTE_ADDR']这里提到了更多获取 IP 的方法。https://stackoverflow.com/a/54325153/2667307审查了返回的评论127.0.0.1请试试:-request()->server('SERVER_ADDR');或者你可以使用$_SERVER['SERVER_ADDR'];或者$_SERVER['REMOTE_ADDR']
打开App,查看更多内容
随时随地看视频慕课网APP