PDA

View Full Version : ... again Online Users



MSYNK
شنبه 24 مرداد 1383, 16:55 عصر
با سلام
قبلا من در مورد الگوریتم این کار (تشخیص کاربران آنلاین) یه تاپیک زده بودم٬ اما حالا یه چیزایی گیرم اومده (راستش رو بخواین از rob تو community server)!
ایشون در جواب بنده گفتن که شما باید یه SnapShot برای کنترل زمان آخرین فعالیت کاربران بسازی که با مثلا 10 دقیقه پیش تا حالا مقایسشون بکنه.
خوب من هم یه Timer رو به کار گرفتم که هر n دقیقه یکبار میره و LastActive کاربران رو چک میکنه و تشخیص میده که از m دقیقه پیش(تو این سایت 5 دقیقه) تا حالا فعال بودند یا نه!
و اما مشکل:
من تو این موندم که
1. بر چه مبنایی Active بودن کاربر رو تشخیص بدم؟
2. کاربران مهمان (guest) رو چیجوری بشناسم؟

و ...

(البته باید بگم که من قبلا برای همه اینها یه روشهایی پیدا کرده بودم اما حالا میخوام که بهترین و بهینه ترین روش رو پیدا کنم!)

با تشکر.

rsalimian
یک شنبه 25 مرداد 1383, 00:24 صبح
روشی که من استفاده کردم و تقریبا جواب گرفتم:
1- یک جدول با دو فیلد نام کاربر و زمان تعریف کنید.(زمان بصورت time stamp)
2- هنگام login هر کاربر و در session_start جدول فوق را پر کنید
3- حالا باید یک روال بنویسید که با توجه به زمان فعلی٬ اطلاعات جدول خوانده و نام کاربران نمایش داده بشود.

البته این روش تا حدودی قابل قبول است. و میتونید تکمیلش کنید.
موفق باشید

mohsen99
یک شنبه 25 مرداد 1383, 08:35 صبح
- یک جدول با دو فیلد نام کاربر و زمان تعریف کنید.(زمان بصورت time stamp)
2- هنگام login هر کاربر و در session_start جدول فوق را پر کنید


اگر کاربر بدون logout از سایت خارج شد چی؟؟؟

MSYNK
یک شنبه 25 مرداد 1383, 11:20 صبح
با سلام
با تشکر از دوستان.
من یکم دیگه روش فکر کردم و یه کم کدهای ASP.NET Forums رو بررسی کردم و به این نتیجه رسیدم:
برای کنترل اینکه کاربر آنلاین هست یا نه٬ باید زمان آخرین فعالیتش رو با زمان حال(البته دقیقتر با n دقیقه پیش تا حالا که n قابل تنظیم هست و همونطور که گفتم تو این سایت برنامه نویس برابر 5 هستش) مقایسه بکنه! خب حالا::
باید تو Page_Load هر صفحه و در هنگام Login شدن کاربر٬ زمان آخرین فعالیت update بشه٬ همین!
بعدش هم که گفتم یه کلاس Timer (که کار همون snap shot رو میکنه) داشته باشیم که مثلا هر 10 دقیقه بیاد و
1. اطلاعات مربوط به کاربران آنلاین قبلی رو از جدول مربوط به کاربران آنلاین پاک کنه!
2. تمام کاربران رو چک کنه و آنلاین بودنشون رو مشخص کنه.
3. کاربرانی که آنلاین بودنشون تایید شد٬ تو جدول مربوط به کاربران آنلاین ذخیره بشه.
تمام.
حالا من موندم که این روش بهترین و بهینه ترین روشه (چک کردن تمام کاربران! مثلا برای سایتی که 1 میلیون کاربر داره٬ اونم مثلا هر 10 دقیقه! :shock: مسلما چنین سایتی کاربران آنلاین زیادی هم داره پس پدر سرور در میاد که! (:D) )
نظری ٬ چیزی؟
با تشکر.

rsalimian
یک شنبه 25 مرداد 1383, 22:32 عصر
اگر کاربر بدون logout از سایت خارج شد چی؟؟؟
ما کاری به logout شدن کاربر نداریم. چون مهم زمان login شدن کاربر است.
ببینید در مرحله 3 کاربران آنلاین چطور بدست می آیند.
در مرحله 2 نام کاربر و زمان login شدن آن در جدول ثبت میشود. و شما با داشتن زمان فعلی و مثلا زمان 10 دقیقه قبل ٬‌ به راحتی می توانید کاربرانی که زمان لاگین شدن آنها از 10 دقیقه قبل به بعد باشد را بدست آورید.

MSYNK
دوشنبه 26 مرداد 1383, 12:18 عصر
با سلام
آقای سلیمیان٬ روش شما یه مشکلی داره:
اگه از زمان Login شدن کاربر بیش تر از 10 دقیقه بگذره و کاربر هنوز هم آنلاین باشه چی؟

در ضمن کسی نیست که در مورد سوال من نظرشو بگه؟
موفق باشین.

Spoofed
سه شنبه 27 مرداد 1383, 11:15 صبح
مقاله جالبی است در مورد بازدید کنندگان
http://www.stardeveloper.com/articles/display.html?article=2002102501&page=1

Inprise
سه شنبه 27 مرداد 1383, 13:19 عصر
در این مورد ، بهترین روش ، روشی است که اورکات ازش استفاده میکنه ؛

Spoofed
سه شنبه 27 مرداد 1383, 15:11 عصر
یکی از راه حل های استاندارد این امر که در اکثر فوروم های php و امثال آن استفاده می شود ، در مقاله ی php‌ زیر بررسی شده :

http://www.phpbuddy.com/article.php?id=15




Overview: You must have seen on some sites displaying the number of users online, this scripts exactly does that it displays number of users currently browsing your site.
The table structure

CREATE TABLE useronline (
timestamp int(15) DEFAULT '0' NOT NULL,
ip varchar(40) NOT NULL,
file varchar(100) NOT NULL,
PRIMARY KEY (timestamp),
KEY ip (ip),
KEY file (file)
);

User's Online Displays the numbers of users on your website at any one time.

<?php
$server = "xxx";
$db_user = "xxx";
$db_pass = "xxx";
$database = "xxx";
$db = mysql_connect($server, $db_user,$db_pass);
mysql_select_db($database,$db);
$timeoutseconds = 300; //5 minutes
$timestamp = time();
$timeout = $timestamp-$timeoutseconds;
$insert = mysql_query("INSERT INTO useronline VALUES ('$timestamp','$REMOTE_ADDR','$PHP_SELF')",$db);
if(!($insert)) {
print "Useronline Insert Failed > ";
}
$delete = mysql_query("DELETE FROM useronline WHERE timestamp<$timeout",$db);
if(!($delete)) {
print "Useronline Delete Failed > ";
}
$result = mysql_query("SELECT DISTINCT ip FROM useronline WHERE file='$PHP_SELF'",$db);
if(!($result)) {
print "Useronline Select Error > ";
}
$user = mysql_num_rows($result);
mysql_close();
if($user == 1) {
print("$user user online\n");
} else {
print("$user users online\n");
}
?>


در این مقاله جدولی برای یوزرهای آنلاین با رکوردهایی از 5 دقیقه قبل درست شده.
سپس IP‌ های یونیک کاربران حاضر در سایت در دیتابیس ذخیره می شود.
در ادامه این افراد اضافه شده در این بازه زمانی (که بر اساس زمان استاندارد یونیکس کار کرده) شمارش می شوند و همچنین یوزرهای قبل از 5 دقیقه قبل از این جدول حذف می شوند. (با توجه به فیلد file‌ آن، این کانتر یوزرها روی هر صفحه ای ، به صورت جداگانه قابل اعمال است)

خوب! این مقاله برای نمایش دادن تمام کاربران حاضر در سایت مناسب است. (چه یوزر و چه مهمان)


برای توسعه آن می توان کمی سورس رو تغییر داد.
یک فیلد is_user‌ بهتر است به جدول اضافه شود با مقدار پیش فرض صفر (یعنی مهمان). (حالت یک یعنی یوزر)
کاربری که به سایت وارد شده (فرقی نمی کند چه وضعیتی دارد) با پیش فرض صفر (مهمان)، آی پی اش ثبت می شود.
سپس هنگامیکه لاگین کرد، در لحظه چک کردن یوزر نیم و پسورد ، در همین جا آی پی او با فیلد is_user=1 ثبت می شود. (اگر آی پی تکراری بود و در مشخصات بازدیدکنندگان از 5 دقیقه قبل وجود داشت ، فقط بیت مربوط به is_user‌ به 1 باید ادیت و آپدیت شود. )
در این حالت کوئری نهایی به سادگی بر اساس فیلد is_user‌ قابل انجام است (چه از لحاظ نمایش تعداد یوزرها و مهمانها ، چه از لحاظ نمایش اسامی و چه از لحاظ نمایش تصاویر و avatars .)

کد فوق نیازی به استفاده مستقیم از سشن ها ندارد. بنابراین تاثیر منفی آنچنانی روی منابع سیستمی نخواهد گذاشت.

در آخر‌ با یک فایل php جداگانه برای سورس فوق و سپس include‌ کردن آن در سورس صفحه می توان این مورد را به یک ماژول تبدیل کرد (برای استفاده مجدد از کد).
در ASP.NET‌ با یک یوزر کنترل ، کار به صورت ماژول قابل استفاده مجدد در می آید.

Inprise
سه شنبه 27 مرداد 1383, 16:07 عصر
روش فوق حتی از استفاده از Session ها هم بدتر هست ، علی الخصوص در محیط PHP . کد فوق ( و کدهائی از این دست ) بدون توجه به ماهیت زبان ( یعنی PHP ) دائما" در حال ایجاد و قطع ارتباط با بانک اطلاعاتی هستند ( هر بار فراخوانی این توابع یک اتصال مبتنی بر سوکت با بانک اطلاعاتی ایجاد میکنه ) و پر واضحه استفاده از این روشها چه تاثیرات منفی روی یک سایت با ویزیتورهای نسبتا" بالا داره .

همونطور که عرض شد هوشمندانه ترین روش مدیریت کاربران حاضر یک سایت خصوصا در محیطهائی مثل دات نت استفاده از روشی است که سایت اورکات ازش استفاده میکنه . یعنی ضمن اینکه از Session برای شناسائی حرکات کاربر استفاده میشه ، از کنترل MS-XML و پروتکل XMLHTTP برای انتقال لحظه ای اطلاعات و حرکات کاربر استفاده میکنه . به عنوان مثال وقتی شما قصد دارید Fan ها رو تغییر بدید ، علی الظاهر هیچ اطلاعاتی از طریق برنامه دات نت منتقل نمیشه ، از کوکی هم استفاده نمیشه ( که اگر اینطور میبود تغییرات روی یک ماشین دیگه معتبر نمیبود ) یا اطلاعات توسط متغیرهای جلسه ذخیره و ارسال نمیشن ، بلکه با کلیک روی هر شکل یا علامت ، جاوا اسکریپت خاصی فعال میشه که با ساختن یک نسخه از MS-XML ، روند فعالیتهای کاربر رو بدون اینکه از اون صفحه خارج بشه یا اطلاعاتی رو Post یا Get کنه به سرور منتقل میکنه . به این ترتیب تنها چیزی که یک سرور برای هندل کردن فعالیتهای کاربری - لحظه به لحظه - احتیاج داره پهنای باند قابل قبول و دیتا ترنسفر لازم هست ؛ با استفاده از این تکنیک حتی میشه فعالیت کاربر داخل یک صفحه وب رو هم کنترل کرد ، بدون اینکه از یک صفحه به صفحهء دیگه بره ! ( حتی در یک مثال رویائی ، سرور میتونه مطلع بشه کاربر همین حالا داره توی ادیتورش یه چیزی مینویسه ، که حتی اگر یک ساعت هم طول بکشه ، بار اون یه جورائی داخل اون سایت هست و فعاله :P )

موفق باشید :)

Spoofed
سه شنبه 27 مرداد 1383, 17:22 عصر
روش فوق حتی از استفاده از Session ها هم بدتر هست ، علی الخصوص در محیط PHP . کد فوق ( و کدهائی از این دست ) بدون توجه به ماهیت زبان ( یعنی PHP ) دائما" در حال ایجاد و قطع ارتباط با بانک اطلاعاتی هستند ( هر بار فراخوانی این توابع یک اتصال مبتنی بر سوکت با بانک اطلاعاتی ایجاد میکنه ) و پر واضحه استفاده از این روشها چه تاثیرات منفی روی یک سایت با ویزیتورهای نسبتا" بالا داره .

مطلب فوق کاملا صحیح است، چه باز و بسته شده کانکشن های زیاد و چه مصرف حجم زیادی از حافظه ی سرور با سشن ها .... ولی در سایت هایی با تعداد بازدید کننده 200 تا 300 در روز آنچنان به نظر نمی رسد (البته بحث اورکات و حجم کاربران آن مسلما یک استثناء است.).

در php مفهومی به نام Persistent Database Connections برای حل این مشکل وجود داره .

Persistent connections are good if the overhead to create a link to your SQL server is high.

http://ir.php.net/features.persistent-connections
هر چند معایب و مزایای خاص خودش را دارد.


در ASP.NET هم Connection pooling وجود دارد :
http://www.dotnetspider.com/Technology/KBPages/346.aspx


ولی همان overhead های ذکر شده جزء جدایی ناپذیر تمام این روش ها هستند (حتی فرستادن مشخصات از طریق XML‌ و ذخیره سازی آن در دیتابیس برای آنالیزهای بعدی هم اینطور است).

Inprise
سه شنبه 27 مرداد 1383, 17:48 عصر
البته بحث اورکات و حجم کاربران آن مسلما یک استثناء است


ارسال اطلاعات به یک برنامهء وب یا یک سرویس وب ، نیازمند پهنای باند مناسب و توانائی پاسخگوئی سرور است ( بدون توجه به مقیاس ) اما برقراری اتصال با بانکهای اطلاعاتی یا استفاده از متغیرهای سمت سرور الزاما" به حافظهء بالا و توانائی قابل قبول پردازندهء سرور نیاز داره ؛ برقراری هر اتصال زمان و حافظه مخصوص به خودش رو میطلبه و باز نگهداشتن اون اتصال ( که در مورد MySQL چندان قابل اعتماد نیست ) هزینه های خاص خودش رو داره ، ضمن اینکه به هیچ وجه امکان ردیابی واقعی فعالیتهای کاربر - با تفاصیلی که گفته شد - با استفاده از تکنیکهائی مثل Session وجود نداره . در واقع برنامه نویسان هوشمند اورکات بهترین تکنیک رو برای Trace "کلیه" رفتارهای مهمانان اورکات بکار بردن که ارتباطی با حجم و مقیاس میزبانی اورکات نداره ؛ طبیعتا" گوگل با یکی از بزرگترین کلاسترهای مبتنی بر وب ، از پس هندل کردن چندین برابر ترافیک فعلی هم بر میاد ، لیکن وقتی بحث User Modeling و کیفیت کد بصورت همزمان مطرح باشه ، استفاده از Session یا بانکهای اطلاعاتی موقت ، راه حلهای چندان جالبی به نظر نمیرسن ، هر چند به عنوان یک نمونه ایراد ، استفاده از تکنیکهائی مانند آنچه گفته شد ، میتونه کاربران سایر مرورگرها رو بعضا" با مشکل مواجه کنه ( هر چند بخش اعظم کاربران از IE یا خانوادهء موزیلا : موزیلا ، فایرفاکس ، نت اسکیپ ) استفاده میکنن . ( کسانی که با اپرا اورکات رو مرور کردن حتما" میدونن چی دارم میگم )

موفق باشید

rsalimian
سه شنبه 27 مرداد 1383, 22:07 عصر
جناب MSYNK من برای تقریبی این مشکل در page_load بعضی صفحات و همچنین در یوزر کنترلی که این عملیات در آن صورت می گیرد. کاربر فعال را به همان جدول مفروض اضافه میکنم:

if (Context.User.Identity.IsAuthenticated)
{
// todo : codes for insert current authenticated user info to table
}

فکر کنم تا حدودی جوابگو باشد.
البته محاسبه کاربران فعال و کلا این عملیات با خطا همراه هست. فقط باید سعی کرد که درصد خطا کمتر بشه.

MSYNK
چهارشنبه 28 مرداد 1383, 09:28 صبح
با سلام
سخنان جناب اینپرایز کاملا متینه!
چون من قبلا از همین روش سشنها استفاده میکردم که واقعا هم نفسگیر هستش؟
اما روشی که تو ASP.NET Forums استفاده شده همونیه که در بالا گفتم منتها به جای گشت و گذار زیاد در سرور اونا (منظورم بهترین برنامه نویسهای ASP.NET هستش) به استفاده زیاد از Cache علاقه دارن (:D)
در این حالت دیگه زیاد اتصال و قطع اتصال با دیتابیس (که در برنامه نویسی تحت وب به عنوان پرهزینه ترین کارها از اونها یاد میشه) نداریم! که خودش مزیت بزرگیه٬ مگه نه؟
راستی اگر phpBB هم از روش سشن ها استفاده میکنه پس این سرعت به نسبت خوبش ماله چیه؟ (منظورم تو یه سایت پرطرفدار مثل خود www.phpBB.com هستش)
با تشکر.

houtanal
چهارشنبه 28 مرداد 1383, 15:14 عصر
روش فوق حتی از استفاده از Session ها هم بدتر هست ، علی الخصوص در محیط PHP . کد فوق ( و کدهائی از این دست ) بدون توجه به ماهیت زبان ( یعنی PHP ) دائما" در حال ایجاد و قطع ارتباط با بانک اطلاعاتی هستند ( هر بار فراخوانی این توابع یک اتصال مبتنی بر سوکت با بانک اطلاعاتی ایجاد میکنه ) و پر واضحه استفاده از این روشها چه تاثیرات منفی روی یک سایت با ویزیتورهای نسبتا" بالا داره .
در بخش php هم چند بار به نکاتی شبیه این اشاره کردید آیا امکانش هست که توضیحدهد چرا php از نظر شما در کار با DB ضعیف است؟

چهارشنبه 28 مرداد 1383, 15:52 عصر
جناب اینپرایز میشه نمونه کد برای این روش که فرمودین هم بفرمایید
با تشکر

Inprise
پنج شنبه 29 مرداد 1383, 13:14 عصر
روش فوق حتی از استفاده از Session ها هم بدتر هست ، علی الخصوص در محیط PHP . کد فوق ( و کدهائی از این دست ) بدون توجه به ماهیت زبان ( یعنی PHP ) دائما" در حال ایجاد و قطع ارتباط با بانک اطلاعاتی هستند ( هر بار فراخوانی این توابع یک اتصال مبتنی بر سوکت با بانک اطلاعاتی ایجاد میکنه ) و پر واضحه استفاده از این روشها چه تاثیرات منفی روی یک سایت با ویزیتورهای نسبتا" بالا داره .
در بخش php هم چند بار به نکاتی شبیه این اشاره کردید آیا امکانش هست که توضیحدهد چرا php از نظر شما در کار با DB ضعیف است؟


ضعیف نیست عزیز برادر ؛

PHP دو نوع اتصال با بانکهای اطلاعاتی میتونه ایجاد کنه ، یکی اتصالهای موقت یکی اتصالهای مانا . در حالت اول به ازای در درخواست یه اتصال برقرار میشه ، در حالت دوم به ازای در هر صفحه یه اتصال برقرار میشه و اتصال باقی میمونه تا timeout . بهر حال در محیط PHP ما یا با خیل عظیمی از درخواستهای اتصال به بانک اطلاعاتی مواجه هستیم یا با اتصالهای متعددی که باز موندن که هر دو Load قابل توجهی روی DataBase Server ایجاد میکنن . ASP .NET با استفاده از ADO .NET و ویژگی Connection Pooling و Connection Cache ای که داره ، این نقیصه رو بر طرف کرده .


میشه نمونه کد برای این روش که فرمودین هم بفرمایید

عرض کردم : اورکات .

پنج شنبه 29 مرداد 1383, 13:55 عصر
اورکات مگه اپن سورسه؟
با تشکر

houtanal
پنج شنبه 29 مرداد 1383, 18:20 عصر
دو نوع اتصال با بانکهای اطلاعاتی میتونه ایجاد کنه ، یکی اتصالهای موقت یکی اتصالهای مانا . در حالت اول به ازای در درخواست یه اتصال برقرار میشه ، در حالت دوم به ازای در هر صفحه یه اتصال برقرار میشه و اتصال باقی میمونه تا timeout . بهر حال در محیط PHP ما یا با خیل عظیمی از درخواستهای اتصال به بانک اطلاعاتی مواجه هستیم یا با اتصالهای متعددی که باز موندن که هر دو Load قابل توجهی روی DataBase Server ایجاد میکنن
برای جلوگیری از این حالت چه راهی هست؟(اصلا هست؟!)در صورتی که این نقیصه در php وجود دارد سایت های بزرگی که از این زبان استفاده کرده اند (با توجه به تعداد خدمات گیرنده بالا در روز) چگونه این مشکل را حل کرده اند؟

Inprise
شنبه 31 مرداد 1383, 03:11 صبح
اورکات مگه اپن سورسه؟

HTML و جاوا اسکریپتهای موجود در هر سایتی اصولا" Open Source هستند ! :roll:


اصلا هست؟

بله . راه حلهای متفرقه متعددی وجود داره .


در صورتی که این نقیصه در php وجود دارد سایت های بزرگی که از این زبان استفاده کرده اند (با توجه به تعداد خدمات گیرنده بالا در روز) چگونه این مشکل را حل کرده اند؟

ببین مسئله دقیقا اینه : تو میتونی Load کمتری روی سرور بانک اطلاعاتی داشته باشی و خرج کمتری برای تقویت سرور بکنی ؛ یا هر وقت سیستمت جواب نداد تقویتش کنی و به کارت ادامه بدی ؛ این یه انتخابه . یقینا" وقتی یه سایت بزرگ با متقاضیان متعدد داره با PHP بدون مشکل کار میکنه ، اگر توان سرور بانک اطلاعاتیش رو کم کنه دیگه قادر به فعالیت نخواهد بود ، از اون طرف ، با استفاده از تکنیکهای عرض شده ( مثلا" دات نت ) میشه تعداد کاربران رو افزایش داد بدون اینکه لازم باشه توانائی سخت افزاری سرور افزایش پیدا کنه .

خوش باشید

شنبه 31 مرداد 1383, 05:08 صبح
نه منظورم بیشتر نحوه ی استفاده از از اون چیزی است که خودتون گفتید اطلاعات را ارسال می کند یعنی همین موضوع که شما گفتید در حالت رویایی می توانید ادیتور کاربر را بخوانید . آیا اون صرفا با جاوا اسکریپت بود؟
با تشکر

Inprise
شنبه 31 مرداد 1383, 11:10 صبح
آره . جاوا اسکریپت وظیفه اش ساختن یک شیء XMLHTTP هست . پس هز جا که بشه جاوا اسکریپت اجرا کرد ( مثلا" در رخدادگران ورود اطلاعات به یک EditBox ) میشه اطلاعات رو ارسال کرد .

شنبه 31 مرداد 1383, 17:56 عصر
خیلی ممنون
راستی یه سوال دیگه نقش XML این وسط چیه؟
با تشکر