PDA

View Full Version : تعداد افراد آنلاین



Chabok
شنبه 09 مهر 1384, 12:53 عصر
با سلام خدمت اساتید محترم
یه سوال مبتدی داشتم:لبخند: . شرمنده:ناراحت:

چطوری میشه تعداد افراد آنلاین را نمایش داد ؟

یه جایی نوشته بود که از شئ Application استفاده کنید

یعنی یک متغیر بگیرید و هنگام Session_Strat یکی بهش اضافه کنید
و در هنگام Session_end یکی ازش کم کنیم

.ولی فکر کنم راه ساده تری وجود داشته باشه.
مثلا تعداد Session ها را بدست بیاوریم یا همچین چیزی

:چشمک:خواهشا کمک کنید
ممنون

arian_pro
شنبه 09 مهر 1384, 16:46 عصر
سلام محسن جان برای این کارها معمولا از java استفاده می کنن بدلیل اینکه اینگونه برنامه ها باید طرف clintاجرا بشه که نخوان هر لحظه به server درخواستی فرستاده بشه می تونی یه سری به این سایتا بزنی
http://www.codeproject.com/jscript
http://www.scripts.com ....

Behrouz_Rad
شنبه 09 مهر 1384, 22:20 عصر
روشی که فرمودید در ASP کلاسیک استفاده میشد و محدودیت هایی داره.
زمان انقضای Session ها به طور پیش فرض، 20 دقیقه است یا زمانی که کاربر مرورگر را ببندد.
اگر زمان انقضای Session را تغییر دهید، بر بقیه Session ها نیز اثر خواهد گذاشت.
ابتدا باید به دنبال روالی بگردید که در هنگام ارسال درخواست کاربر به سرور، فراخوانی می شود.
روال BeginRequest در فایل Global.asax بهترین انتخاب است.
داده ها باید در یک بازه ی زمانی Refresh شوند.
در اینجا مکانیزم Caching پاسخگوی نیاز ماست.
در روال BeginRequest فایل Global.asax


Context.Cache.Insert(Context.Request.UserHostName, "test", Nothing, DateTime.Now.AddMinutes(5), TimeSpan.Zero)

کلید Cache، آدرس IP کاربر است.
در صورتی که مقدار کلید (پارامتر اول) متد Insert شی Cache، تکراری باشد، مقدار وارد شده در کلید مشخص شده Overwrite خواهد شد و این دقیقا همان چیزی است که ما می خواهیم.
به عبارت بهتر: آپدیت آخرین زمان ارسال درخواست کاربر
با دستور Cache.Count نیز، تعداد آیتم های موجود در Cache یا به عبارت بهتر، تعداد افراد آنلاین به دست خواهد آمد.
در دستور فوق، تعداد افراد آنلاین بر مبنای افراد آنلاین از 5 دقیقه ی پیش تا به حال به دست خواهد آمد.
نکته ی مهم: در صورتی که از Cache برای مقاصد دیگری نیز استفاده می کنید، در زمان فراخوانی دستور Cache.Count، تعداد Cache هایی را که از آنها استفاده می کنید از کل Cache کم کنید.
موفق باشید.

Behrouz_Rad
یک شنبه 10 مهر 1384, 17:39 عصر
یک نکته ی دیگه رو هم اضافه کنم.
مسلما در برخی سایت ها از جمله همین سایت دیدید که تعداد کاربران رجیستر شده و تعداد کاربران مهمان از هم تفکیک شدند.
اینکار رو هم به سادگی می تونید انجام بدید.
در کد فوق ملاحظه می کنید که در پارامتر Value هر کلید (Key)، عبارت "test" رو قرار دادم.
حال با شناسایی کاربران رجیستر شده و نشده (بر عهده خود شما)، اگر کاربری مورد تصدیق هویت قرار گرفته بود، در پارامتر Value هر کلید، عبارت "Known" و در غیر اینصورت عبارت "Unknown" را قرار دهید.
شی Cache دارای متدی با نام GetEnumerator است که لیستی از آیتم های موجود در Cache را بر می گرداند.
مقدار برگشتی این متد در اینترفیس IDictionaryEnumerator قرار خواهد گرفت.
حال با یک حلقه ی تکرار درون آیتم های بازیابی شده در اینترفیس فوق، به راحتی قادر به تشخیص تعداد کاربران رجیستر شده و تعداد کاربران مهمان هستید.
تکه کدی که در زیر نوشتم، اینکار رو به راحتی برای شما انجام خواهد داد:


Dim CacheEnum As IDictionaryEnumerator = Cache.GetEnumerator()
Dim cacheRegistered As Int32 = 0
Dim cacheGuest As Int32 = 0
Do While CacheEnum.MoveNext()
cacheRegistered += IIf(CacheEnum.Current.Value.ToString() = "Known", 1, 0)
cacheGuest += IIf(CacheEnum.Current.Value.ToString() = "Unknown", 1, 0)
Loop
Response.Write("The Total Number of Users is: " & cacheRegistered + cacheGuest & "<br>")
Response.Write("The Number of Registered User is: " & cacheRegistered.ToString() & "<br>")
Response.Write("The Number of Guest Users is: " & cacheGuest.ToString())

توجه مهم: تمامی روش هایی که در دو پست فوق توضیح دادم، حافظه Cache سرور را مصرف می کنند.
بهترین راه، نگهداری اطلاعات در دیتابیس است که تا حدودی متفاوت با روش های فوق است و همراه با Cache استفاده می شود.
موفق باشید.

Ali_M.Eghbaldar
چهارشنبه 06 مهر 1390, 16:59 عصر
با سلام :افسرده:
آقای راد واقعا روشه جالبی بود.
فقط جنتا سوال دارم , اگه دوستانه دیگری هم اطلاعاتی دارن کمک کنن.

1: اگه Cache پر بشه چه اتفاقی می افته و بعد از اون اتقاف باید چیکار کرد؟

2:زمان از بین رفتن هر cache در صورت ارسال نشدن درخواستی 5 دقیقه هست؟ این زمان قابل تغییره؟

3:در قسمت آخر گفتید حالت تلفیقی با Database بهتره یعنی چطوری ؟

محمد متاله
چهارشنبه 06 مهر 1390, 18:23 عصر
سلام محسن جان برای این کارها معمولا از java استفاده می کنن بدلیل اینکه اینگونه برنامه ها باید طرف clintاجرا بشه که نخوان هر لحظه به server درخواستی فرستاده بشه می تونی یه سری به این سایتا بزنی
http://www.codeproject.com/jscript
http://www.scripts.com ....

ببخشید سوال ایشان ربطی به برنامه نویسی سمت کلاینت نداره هر چیزی هست در سمت سروره


تو فایل Global.asax یک event ی به نام Application_Start هست تو اون Application["onlineUser"] = 0; را اضافه کن
در رویداد SessionStart هم Application["onlineUser"] = (int)Application["onlineUser"] + 1; هم اضافه کن و در رویداد Session_End
Application["onlineUser"] = (int)Application["onlineUser"] - 1;

توی هر صفحه ای که خواستی می توانی متغیر Application["onlineUser"] را بخوانی که حاوی کاربران آنلاین می باشد
اگر این فایل را تو ساییتان ندارید روی Solution سایتتان کلیک راست کنید و در Add New Item به ساییتان آن را اضافه کنید

بنده تو تمام سایت هام از این روش استفاده می کنم و در پایان روز این مقدار را به همراه تاریخش که در متغیری از نوع Application هست را در DB ذخیره می کنم تا آن را از دست ندهم چون برای مدیران سایت ها این آمار مهم می باشد

البته بعضی ها به ازای هر بار وارد شدن کاربر به سایت به جای ذخیره این مقدار در متغیر Aplication مستقیما DB را Update می کنند که به نظرم خیلی غیر منطقی هست چون برای کاربران زیاد مثلا 2000 نفر در آن واحد (مثل سایت تبیان دات نت) که دائما در حال وارد شدن و خارج شدن به سایت هستند بار زیادی را به سرور وارد می کنند حتی اگر DB بر روی سرور دیگری قرار گرفته باشد

fakhravari
چهارشنبه 06 مهر 1390, 19:16 عصر
با سلام
اقای محمد متاله در باره امار دقیق وب سایت در حد تعداد انلاین و مهمان < از ممبر شیپ > . به چه شکل است .
اگه میشه این post هم جواب دهید
با سپاس
http://barnamenevis.org/showthread.php?306959-update-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1-membership

Ali_M.Eghbaldar
چهارشنبه 06 مهر 1390, 20:18 عصر
سلام آقا محمد متاله :لبخندساده: (http://barnamenevis.org/member.php?92632-%D9%85%D8%AD%D9%85%D8%AF-%D9%85%D8%AA%D8%A7%D9%84%D9%87)

آقای راد چون گفتند استفاده از این متغییر محدودیت داره من او سوال پرسیدم تا از Cache استفاده کنم یکی از مشکلات و محدودیت های استفاده از Session_End این است که اگه کاربر تمام صفحاتی سایتی که در آن هست ببنده این رویداد Session_End بطور پیش فرض 20 دقیقه بعد اجرا میشه که این تاخیر برای من که می خوام کارم تاخیر نداشته باشه خیلی مهمه
مشکله من اینه ؟ آیا پیشنهادی دارید ؟

محمد متاله
پنج شنبه 21 مهر 1390, 01:33 صبح
درون تگ <system.web> مقدار timeout را به صورت زیر می توانید تنظیم کنید
<sessionState cookieless="false" mode="InProc" timeout="10" regenerateExpiredSessionId="false">
که در اینجه پس از 10 دقیقه session کاربر اگر کاری در سایت انجام نده به پایان می رسد
بهتر هست که خودتان در رویداد session_End مقدار session کاربران را نیز clear کنید
در ضمن خاصیت mode دارای چندین حالت می باشد که با یک سرچ کوچک مقادیر قابل قبول و نیز تفاوت هایش که به نظرم مهم هست را پیدا بفرمائید و هر حالت که مورد نیازتان هست را استفاده بفرمائید

engmovassagh
چهارشنبه 25 آبان 1390, 14:38 عصر
از Ajax استفاده کنید

fakhravari
چهارشنبه 25 آبان 1390, 15:02 عصر
دوستان آیا بهترین راه استفاده از دیتابیس است :متفکر:!!
و تشخیص از روی Ip کاربران.

mahdioo12194
چهارشنبه 25 آبان 1390, 15:06 عصر
ببخشید سوال ایشان ربطی به برنامه نویسی سمت کلاینت نداره هر چیزی هست در سمت سروره


تو فایل Global.asax یک event ی به نام Application_Start هست تو اون Application["onlineUser"] = 0; را اضافه کن
در رویداد SessionStart هم Application["onlineUser"] = (int)Application["onlineUser"] + 1; هم اضافه کن و در رویداد Session_End
Application["onlineUser"] = (int)Application["onlineUser"] - 1;

توی هر صفحه ای که خواستی می توانی متغیر Application["onlineUser"] را بخوانی که حاوی کاربران آنلاین می باشد
اگر این فایل را تو ساییتان ندارید روی Solution سایتتان کلیک راست کنید و در Add New Item به ساییتان آن را اضافه کنید

بنده تو تمام سایت هام از این روش استفاده می کنم و در پایان روز این مقدار را به همراه تاریخش که در متغیری از نوع Application هست را در DB ذخیره می کنم تا آن را از دست ندهم چون برای مدیران سایت ها این آمار مهم می باشد

البته بعضی ها به ازای هر بار وارد شدن کاربر به سایت به جای ذخیره این مقدار در متغیر Aplication مستقیما DB را Update می کنند که به نظرم خیلی غیر منطقی هست چون برای کاربران زیاد مثلا 2000 نفر در آن واحد (مثل سایت تبیان دات نت) که دائما در حال وارد شدن و خارج شدن به سایت هستند بار زیادی را به سرور وارد می کنند حتی اگر DB بر روی سرور دیگری قرار گرفته باشد

اگه می شه یه مثال همراه سورس بزنید تا ما استفاده کنیم:خجالت:

fakhravari
سه شنبه 15 آذر 1390, 14:10 عصر
اگه می شه یه مثال همراه سورس بزنید تا ما استفاده کنیم:خجالت:

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

ironclip
چهارشنبه 16 آذر 1390, 00:15 صبح
درود
تو بیشتر سایت ها فقط سورس این گلوبال رو گذاشتن
حداقل بگید چطور از این فایل استفاده کنیم
یا یک پروژه کوچیک در این رابطه بزارید
ممنون

fakhravari
چهارشنبه 16 آذر 1390, 00:40 صبح
با سلام
وقتی در فایل گلوبال گذاشتی مثل سشن ازش استفاده کن
Label1.Text = Application["onlineUser"].ToString();

dorparasti
چهارشنبه 16 آذر 1390, 00:50 صبح
بحث سر همین مدت زمان است . چه 10 چه 20 . تا وقتی session زمانش تمام نشود ، آمار غیر واقعی است . اما روش جناب راد روش جالبی است . خیلی وقت بود درگیر این مسئله بودم . ممنون

fakhravari
چهارشنبه 16 آذر 1390, 01:15 صبح
سلام اقای زائری در مورد اجرای این روش کمی توضیح دهید

m.toosi
جمعه 18 آذر 1390, 22:16 عصر
منم با آقای fakhravari موافقم چون من در حال حاضر از این روش استفاده میکنم و واقعا آمار دقیق نشون نمیده خیلی بد نشون میده:ناراحت:
اگر کسی روش بهتری داره به صورت کامل با جزییاتش بیان کنه
یا برنامه اش رو برای بقیه دوستان هم در این پست بزاره
ممنون از همه دوستان

fakhravari
جمعه 18 آذر 1390, 23:18 عصر
با سلام
ایا استفاده از table رو پیشنهاد میکنید برای امار سایت؟

hashemi85sep
دوشنبه 03 بهمن 1390, 23:43 عصر
81335سلام دوستان
من برای آمار بازدید پروژم از این روش استفاده میکنم
به نظرم که مشکلی نداره
فایل پروژم رو زمیمه میکنم
اگه مشکلی داره بیان کنید
ممنون میشم

Rohollaes
سه شنبه 04 بهمن 1390, 12:31 عصر
سلام ،آقای هاشمی من کلا با روش آقای راد موافقم"استفاده از کش و دیتابیس" اما روشی که شما داری استفاده میکنی به جای اینکه چندتا فایل تکست بسازی میتونی یه فایل xml بسازی. یه نمونه توی فایل ضمیمه گذاشتم

hashemi85sep
چهارشنبه 05 بهمن 1390, 10:06 صبح
سلام ،آقای هاشمی من کلا با روش آقای راد موافقم"استفاده از کش و دیتابیس" اما روشی که شما داری استفاده میکنی به جای اینکه چندتا فایل تکست بسازی میتونی یه فایل xml بسازی. یه نمونه توی فایل ضمیمه گذاشتم

سلام
ذخیره توی فایل xml با txt چه تفاوتی داره مگه ؟

Rohollaes
چهارشنبه 05 بهمن 1390, 13:51 عصر
شما به جای اینکه چندتا فایل تکست ایجاد کنی و به هرکدومشون روی هاست دسترسی نوشتن بدی فقط یه فایل xml تعریف کردی و برای هر فیلدی یه node توی اون تعریف میکنی،به نظر من کار باهاش خیلی آسون تره و خوب دسترسی به هر فیلد آسون تر خواهد بود،"دقیقا مثل یه تیبل که ساختار درختی و سلسله مراتبی داره"

fakhravari
چهارشنبه 05 بهمن 1390, 13:57 عصر
سلام
Rohollaes (http://barnamenevis.org/member.php?166535-Rohollaes) سمپلش میزارید