محسن مهری
4 سال پیش توسط محسن مهری مطرح شد
5 پاسخ

ثبت تعداد کاربران انلاین - توضیح پیاده سازی بدون استفاده از سوکت

درود -
دوستان من میخام تعداد کاربران آنلاین ( افرادی که ثبت نام نیستند) در لحظه و همچنین تعداد ویو خوردن یک پست/مقاله/.... رو ثبت کنم .
از لحاظ پیاده سازی پیشنهاد بدین چه کنم؟


ثبت پرسش جدید
محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 4 سال پیش مطرح شد
1

اگر آمار دقیق و لحظه ای کاربران آنلاین رو بخواهید راه دیگری جز WebSocket نیست. ولی اگر دقیق بودنش زیاد براتون اهمیت نداره مثلا میشه یک middleware ایجاد کنید و با هر ریکوئستی که از کاربر دریافت می‌کنید، فیلد last_activity رو که از جنس datetime براش تعریف کردید به زمان حاضر آپدیت کنید.

بعد با یک function تعداد کاربرهایی که از زمان آخرین فعالیتشون کمتر از N دقیقه می‌گذره در بیارید. با اینکه از نظر فنی دقیقا معادل کاربران آنلاین نیست ولی در بعضی مواقع در همین حد هم کفایت می‌کنه. نکته منفی این قضیه فقط سرباری هست که بابت آپدیت این فیلد به ازای هر درخواست به سرور تحمیل میشه و باید سبک سنگین کنید که آیا ارزش داره یا نه.

برای تعداد view های مربوط به پست و مقاله هم کافیه یک فیلد view_count از نوع integer براشون تعریف کنید و با هر بار ریکوئست دریافتی برای هر مقاله، تعدادش رو یکی اضافه کنیم. (یک روش رایج دیگه هم استفاده از Redis هست)

در کنار تمامی راهکار فوق، یک آپشن جذاب دیگه هم راه اندازی و فعالسازی Google Analytics هست و بعد استفاده از داده هایی که جمع آوری می‌کنه از طریق API و مثلا با استفاده از پکیج زیر:
https://github.com/spatie/laravel-analytics


GHM
تخصص : دولوپر نیمه‌استک
@GHM 4 سال پیش مطرح شد
1

برای گرفتن افراد آنلاین، یک کوکی یا سشن تعریف کن با نام مثلا is_onlone و مقدارش هم IP کاربر و زمان فعلی درنظر بگیر بعدش توی هر درخواست جمع‌آوری‌شون میکنی توی یه جدول جدا مثلا با نام last_activity و هرجا خواستی میتونی ازشون استفاده کنی. پ.ن: توی هر درخواست چک میکنی که IP کاربر توی جدول موردنظر ذخیره هست یا نه و زمانش هم از 5 دقیقه گذشته یا نه (شسن یا کوکی هم چک میکنی) ، اگر بود کاریش نداری و همزمان میایی همه کاربران رو هم چک میکنی اگر 5 دقیقه ازشون گذشته بود حذفشون میکنی حالا اونایی که باقی موندن افراد آنلاین هستن، سناریوش یه همچین چیزی هست ولی خب توی بحث زمان خیلی دقیق نیست همونطور که دوستمون در بالا اشاره کردن


محسن مهری
تخصص : برنامه نویس back-end با زبان...
@mohsen.mehri6101 4 سال پیش آپدیت شد
0

@GHM
درود دوست عزیز ممنون - اما من دنبال ثبت کاربرایی هستم که ثبت نام نکردند توی سایت!اما بازهم تشکر
@mhyeganeh
درود جناب یگانه و ممنون از حضور همیشه در صحنتون.
پکیجی که معرفی کردین فک کنم روش مناسبی باشه(اما خب ترجیح میدم خودم پیاده سازی کنم)، لطفا ببینید چیزی که میگم درسته یا نه ؟شدنیه ؟
سناریویی که من فهمیدم این هستش، از اونجایی که http protocol یک پروتکل stateless هستش. ما نمیتونیم یک ریکوئست با ریکوئست دیگه رو تشخیص بدیم که مال کی هستش؟؟!! . برای همون تنها کاری که میتونیم بکنم اینه که در اولین درخواست طرف یک کوکی باهاش ست کنم و با هر درخواستش بررسی کنم که اگه اون کوکی ( که بایک سیشن ست شده این طرف یا توی کش فایل و یا دیتابیس) ببینم این همون کاربره یا نه .وقتی اولین بار این سیشن این سمت بک اند ست میشه یک زمان به نام createdat داره که توش ذخیره میشه ، و یک فید دیگه میسازم به نام updatedat که با هر بار دوباره درخواست طرف این فیلد اپدیت میشه
اختلاف این دو میشه مقدار انلاین بودن طرف ( به صورت تقریبی) برای اولین بار هم updatedAt رو با ده دقیقه تاخیر ثبت میکنیم برای اولین درخواست
نظر شما ؟


GHM
تخصص : دولوپر نیمه‌استک
@GHM 4 سال پیش آپدیت شد
0

خواهش میکنم دوست عزیز اما اشاره‌ای به کاربران ثبت‌نام شده یا مهمان نکردم کوکی رو میتونید برای هر نقش ست کنید اون فقط یک تعریف کلی بود.


محسن مهری
تخصص : برنامه نویس back-end با زبان...
@mohsen.mehri6101 4 سال پیش مطرح شد
0

@GHM
درود دوست عزیز - ممنون بله اشتباه از من بوده مثل اینکه - دقیقا روش شما رو میخام انجام بدم - تا جایی که من فک کردم هم دقیقا فقط با تعریف سیشن ( که خودش یک کوکی سمت کاربر ست میکنه باهاش) میشه این مبحث رو پیاده سازی کرد،( زمانی که بخایم البته از وب سوکت استفاده نکنیم که اینجا هم به صرفه و عاقلانه نیست چنین مبحثی با وب سوکت)


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام