PDA

View Full Version : عدم نمايش صحيح كاربران online سايت



ali_kolahdoozan
سه شنبه 21 خرداد 1387, 08:38 صبح
سلام

بارها شده كه خواستيم user هاي online رو بشماريم و هميشه هم از sessionstart و sessionend استفاده كرديم . خوب جواب ميدهد يك متغير در application ميگيريم و .... / اما اين يك عدد دقيق نميدهد اكثرا هم عيب از عدم اجراي به موقع رويداد sessionend است آيا تا به حال دقت كرديد؟ چرا اينگونه است؟ راهي داره؟

در ضمن مهمانان سايت رو فرض كنيد . آنها هيچي توي db ازشون نيست . مشگل آنها هستن

Behrouz_Rad
سه شنبه 21 خرداد 1387, 09:01 صبح
شیوه ای که شما استفاده می کنی، شیوه ای منسوخ شده است.
به طور پیش فرض، Session تا 20 دقیقه در حافظه باقی می مونه. روال Session End به گونه ای که ما یافتیم! تنها در صورت حذف صریح Session فراخوانی میشه. به هر حال برای پیاده سازی سیستم های آماری در ASP.NET از Cache استفاده میشه. اطلاعات در DataTable ای در Cache قرار می گیرن.

موفق باشید.

ali_kolahdoozan
سه شنبه 21 خرداد 1387, 09:07 صبح
خوب محل نگهداري صحيح . از كجا بفهميم طرف رفت بيرون يا اومد تو ؟ آيا ديگه دقيق ميشه؟

dr_csharp
سه شنبه 21 خرداد 1387, 10:08 صبح
خوب محل نگهداري صحيح . از كجا بفهميم طرف رفت بيرون يا اومد تو ؟ آيا ديگه دقيق ميشه؟
فکر میکنم رویداد Application_Start برای اینکار شما مناسبتره .
آمارش بازهم نسبی هست ولی خوب خطاش کمتره و به واقعیت نزدیکتره.برای اینکه آمارتون بهتر شه بهتره توی اون کش،مشخصات 10 تا کاربر آخر (مثلا شماره IP) نگهداری بشه تا مجدد کنتر نندازید :لبخندساده:

chaalesh
سه شنبه 21 خرداد 1387, 10:51 صبح
آقای راد برای ذخیره بازدیدهای امروز در دیتابیس از چی استفاده بشه بهتره ؟
من از Application_End استفاده کردم ولی خیلی دقیق نیست !!!

ali_kolahdoozan
سه شنبه 21 خرداد 1387, 11:00 صبح
مشگل start نيست مشگل بيشتر خروج كاربر است كه درست event ها روش كار نمي دهند

Behrouz_Rad
سه شنبه 21 خرداد 1387, 11:47 صبح
از كجا بفهميم طرف رفت بيرون يا اومد تو ؟ آيا ديگه دقيق ميشه؟

می تونی دقیقا متوجه بشی کی اومده اما زمان بیرون رفتنش رو باید از خدا بپرسی!
مثلا همین سایت تا 30 دقیقه بعد از آخرین فعالیت آی دیت رو در لیست کاربران آنلاین نگه میداره و اگر تا بعد از 30 دقیقه فعالیتی نداشته باشی، آی دیت از لیست کاربران آنلاین خارج میشه.


فکر میکنم رویداد Application_Request برای اینکار شما مناسبتره .

!!!!!!!!!!!!!!!!!!!!!!!!!!

موفق باشید.

ali_kolahdoozan
سه شنبه 21 خرداد 1387, 12:06 عصر
خوب كاربر عضو رو باز هم ميشه يك كاريش كرد . اما مهمان ناجوره . پس دقت خاصي توش نيست؟

Behrouz_Rad
سه شنبه 21 خرداد 1387, 12:20 عصر
ماشاا... اینقدر تعداد تراکنش ها در این سایت زیاد هست که بنده گاهی اوقات پست ها رو نمی بینم! ;)



آقای راد برای ذخیره بازدیدهای امروز در دیتابیس از چی استفاده بشه بهتره ؟
من از Application_End استفاده کردم ولی خیلی دقیق نیست !!!

Application_End برای چی؟ تاریخ بازدیدها رو هم در دیتابیس ذخیره کن و خیلی ساده آمار روزانه رو استخراج کن.


در ضمن مهمانان سايت رو فرض كنيد . آنها هيچي توي db ازشون نيست . مشگل آنها هستن

برادر کلاهدوزان!
وقتی پستت رو ویرایش می کنی ندایی بده که متوجه بشیم ;)
اگر کاربر، تصدیق هویت نشده بر مبنای IP اون عمل کن. البته همیشه افرادی هستند که میگن IP در LAN میتونه یکسان باشه. این افراد می تونن یک کوکی با محتوای GUID بر روی سیستم کاربران ایجاد کنند و با هر درخواست مقدار این کوکی رو با مقدار متناظر با IP اون در Cache مقایسه کنن. در صورتی که مقدار متفاوتی رو یافتند، به راحتی درخواست رو به عنوان یک کاربر جدید در نظر بگیرند و یک واحد به تعداد کاربران آنلاین اضافه کنند.

راه های مختلفی وجود داره که البته تفاوت در جزئیات هست نه در کلیات.

موفق باشید.

ali_kolahdoozan
سه شنبه 21 خرداد 1387, 12:49 عصر
بهروز جان عزيز : خروج رو يك فكري بكنيم ورود موردي نداره

Behrouz_Rad
سه شنبه 21 خرداد 1387, 15:46 عصر
بهروز جان عزيز : خروج رو يك فكري بكنيم ورود موردي نداره

علی جان تشخیص خروج "تقریباً" امکان پذیر نیست. اگر بود خیلی ها قبل تر این کار رو کرده بودند.
دلیلش رو در ادامه توضیح میدم.
اول باید دید که خروج رو چی معنا می کنی؟ مطمئنا مشکل برای حالتی است که کاربر عضو شده بدون کلیک بر روی دکمه خروج و همچنین کاربر مهمان با بستن پنجره از سایت خارج میشه. ضمن اینکه ممکنه کاربر صفحه ی سایت رو نبسته باشه و مثلا برای 3 ساعت میز کار رو ترک کرده باشه. آیا چنین کاربری رو هم باید جزء کاربران آنلاین محسوب کرد؟ پاسخ این سوال به شما بستگی داره. من میگم نه! ممکنه تو بگی آره ;)
به هر حال...
تنها راهی که میشه در موردش فکر کرد، AJAX هست. اگر قصد پیاده سازی حالت فوق رو داشته باشی (یعنی تا زمانی که صفحه ی سایت روی سیستم کاربر باز هست)، با AJAX میشه در هر بازه ی زمانی مشخص به سرور درخواست ارسال کرد و زمان آخرین فعالیت کاربر رو آپدیت کرد.
در حالت دوم، اگر کاربر با بستن پنجره ی مرورگر از سایت خارج شد، میشه روال onunload رو با AJAX هندل کرد و قبل از بسته شدن پنجره درخواستی رو ارسال کرد تا کاربر رو از لیست کاربران آنلاین خارج کرد.

اما یک مشکل بزرگ برای پیاده سازی دو حالت فوق داره که همین مشکل باعث میشه هیچ سایتی از این دو روش استفاده نکنه.

یکی از مشکلات بزرگ AJAX، بُروز کوئری های ناقص در اون هست.
نمی دونم به سیستم ارسال پاسخ سریع سایت برنامه نویس پیش از اینکه به نسخه ی 3.7.0 مهاجرت کنیم دقت کردی یا نه. تا قبل از این نسخه، اگر از یک Connection با سرعت پایین استفاده می کردی، AJAX نمی تونست با موفقیت درخواست ارسال پست رو بفرسته و در نتیجه جمله ی "در حال ارسال پست، لطفا چند لحظه صبر کنید..." رو تا آخر عمرت میدیدی! اما حالا، در صورتی که در یک بازه ی مشخص AJAX موفق به ارسال پست نشه، به طور خودکار به حالت پیشرفته سویچ میشه تا کاربر به شکل کلاسیک بتونه پستش رو ارسال کنه.
AJAX یک تکنولوژی قابل اطمینان برای Connection های با سرعت پایین نیست. به همین دلیل نمیشه به دو مورد فوق اطمینان کرد.

موفق باشید.

ali_kolahdoozan
سه شنبه 21 خرداد 1387, 16:07 عصر
دمت گرم . اين شد حرف حساب . زدي به هدف . اين تاپيك به نظر من به نتيجه رسيده محسوب ميشه .

raravaice
سه شنبه 21 خرداد 1387, 17:14 عصر
در حالت دوم، اگر کاربر با بستن پنجره ی مرورگر از سایت خارج شد، میشه روال onunload رو با AJAX هندل کرد و قبل از بسته شدن پنجره درخواستی رو ارسال کرد تا کاربر رو از لیست کاربران آنلاین خارج کرد.
برای تکمیل گفته های جناب راد :
جساراتا بنا به تجربه انجام این کار ، یکی دیگه از مشکلاتی که سره راه وجود داره من اینجا بیان میکنم.
اونم اینکه وقتی پنجره بسته میشه و رویداد onunload اتفاق میافته تا بیاد درخواست Ajax هندل بشه پنجره بسته شده و هیچ فایده ای نداره در این جور مواقع سعی کن از Get استفاده کنی و دیتای ارسالی کوتاه و مختصر باشه و برای ایجاد وقفه یه Alert یا Confirm ایجاد کن که درخواست Ajax کامل ارسال بشه.

مثل کاری که Yahoo میل جدید موقع بستن پنجره بدون SignOut انجام میده.

موفق باشید

a_true_2004
چهارشنبه 22 خرداد 1387, 03:48 صبح
سلام


علی جان تشخیص خروج "تقریباً" امکان پذیر نیست. اگر بود خیلی ها قبل تر این کار رو کرده بودند.


حالا نگاهی به عکسهای زیر بندازید.

عکس اول :

http://boxstr.com/files/2339119_bazt6/1.png

عکس دوم :

http://boxstr.com/files/2339120_zujda/2.png

این عکسها مربوط به سرویس آمار گوگل هست که برای یک سایت تنظیم کردم.(اگه می بینید آمار بازدید کننده ها پایینه به خاطر اینه که هنوز سایت به طور رسمی شروع به کار نکرده و هنوز ریزه کاری داره. بگذریم).
مقصود من اون قسمت هایی هست که با کادر قرمز مشخص شدن.
توی این قسمت ها میانگین کلی --> کشوری و در عکس دوم هم میانگین استانی زمانی که کاربران اون منطقه آنلاین بودن رو میبینید.
مسلماً سرویس آمار گوگل زمان خروج هر بازدید کننده رو میتونسته حساب کنه که به این نتایج دقیق رسیده.
حالا چجوری ؟؟؟؟؟؟؟؟؟؟/

برای اینکه این سرویس رو برای این سایت راه اندازی کنم توی هر صفحه ای که نیاز به آمار گیری داشتم این کد که خود سایت گوگل داده رو در بین کدهای HTML وارد کردم

<!--Google analytics-->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-3038717-2";
urchinTracker();
</script>
<!--End-->


خب دیگه میدونین که هر چی هست توی این فایل urchin.js هست. که می تونین از اینجا (http://boxstr.com/files/2339023_stamn/urchin.js)بردارید.
من که نه بلد بودم نه حوصلش رو داشتم که بگردم ببینم چکار می کنه. هرکی فهمید یک خبری بده.

Behrouz_Rad
چهارشنبه 22 خرداد 1387, 07:16 صبح
نه حاجی!
گوگل این آمار رو بر اساس IP و کوکی که روی سیستم کاربر ذخیره می کنه به دست میاره. زمان اولین درخواست رو با زمان آخرین درخواست در یک بازه ی زمانی مشخص مقایسه می کنه، اگر از حدی فراتر نرفته بود، اون رو به عنوان زمان حضور فرد در نظر می گیره. در نهایت همه ی این زمان ها رو با هم جمع می کنه تا میانگینش به دست بیاد... به همین سادگی :)

موفق باشید.

cactuskhan
سه شنبه 28 آبان 1387, 20:00 عصر
من کل تاپیک رو خوندم هنوز دستگیرم نشده که باید چیکار کنم،میگید که بزارید session_end بیاد یکاری بکنه مثلا بعد از 20 دقیقه !!
مشکل من اینکه وقتی کاربر login کرد و خروج رو نزد بعد ie رو بست حالا بعد از 20 دقیقه اون متد فراخوانی میشه اگه اینطوره باز هم به درد نمی خوره چون این متد زمانی فراخوانی میشه که session از بین رفته یعنی من دیگه مقدار session رو ندارم اگه من userId رو توی session ذخیره کرده باشم دیگه مقدار اون رو ندارم که بخوام اون کاربر خاص رو از حال lock خارج کنم !!

خواهشا یک راه حلی وجود داره بصورت عملی عنوان کنید !!!
بدجوری به این موضوع نیاز دارم !!

cactuskhan
چهارشنبه 29 آبان 1387, 09:34 صبح
نمی دونم آیا واسه جواب گرفتن باید تاپیک جدید بزنم ؟؟

milade
چهارشنبه 29 آبان 1387, 12:53 عصر
الان کجا گیر دارید شما؟

cactuskhan
چهارشنبه 29 آبان 1387, 13:14 عصر
کاربر سایت میاد login می کنه و یک فیلد توی بانک هست که true میشه یعنی این کاربر وارد شده حالا وقتی logout میکنه مشکلی نیست و دوباره اون فیلد false میشه!
مشکل اینجاست وقتی کاربر logout نمیکنه کامپیوتر رو خاموش میکنه یا IE رو میبنده و... چطور من دوباره بفهمم کدوم کاربر login بوده و logout نکرده تا خودم فیلد(flag) اون رو flase کنم !
دوستان میگن از Session_End استفاده ولی این بدرد نمی خوره چون وقتی فراخوانی میشه که هیچ session ی وجود ندارد ! پس من نمی تونم بفهمم کدون userId وجود داشته که حالا نیست !!!!

milade
چهارشنبه 29 آبان 1387, 13:21 عصر
یادمه جواب داده بودم(توی پستام سرچ کن)
ولی در کل کی میگه تا وقتی هیچ سشنی نباشه این فراخوانی نمیشه؟(ایا مطمعنید یا امتحان کردید؟)

cactuskhan
چهارشنبه 29 آبان 1387, 13:26 عصر
یادمه جواب داده بودم(توی پستام سرچ کن)
ولی در کل کی میگه تا وقتی هیچ سشنی نباشه این فراخوانی نمیشه؟(ایا مطمعنید یا امتحان کردید؟)

سرچ کردم و چیزی دستگیرم نشد که اومدم پست دادم!
آره شما میایی توی session_start یه سشن تعریف میکنی وقتی که اون سشن از بین میره این متد فراخوانی میشه ! پس دیگه سشنی نیست که ما بتونیم مقدار اون رو داشته باشیم.!!! :متفکر:

راه حل چیه ؟:افسرده:

milade
چهارشنبه 29 آبان 1387, 13:29 عصر
http://www.barnamenevis.org/forum/showthread.php?t=125139
اینو ببین
و در ضمن فکر نکنم که Session_End در پایان جلسه همه سشن ها فراخوانی بشه(استاد راد کمک کنید)

cactuskhan
چهارشنبه 29 آبان 1387, 14:55 عصر
اون پست ها رو دیدم راه حل ها ارائه شد عملی نیست سشن رو که نمیشه با 1 دقیقه تنظیم کرد !

دوستان اگه کسی چنین تجربه ای داره راهنمایی کنه !!