PDA

View Full Version : سوال: گرفتن تعداد افراد انلاین و آپدیت تایم با هر بازدید



tem988
شنبه 23 شهریور 1392, 18:36 عصر
سلام
برای گرفتن افراد انلاین در سایت تنها گرفتن آی پی هست و برای هر آی پی تایمی ذخیره میشه که اگر اون آی پی تا چند دقیقه بازدید نکرد که من روی 5 دقیقه تنظیم کردم از دیتابیس حذف بشه و اگر قبل از 5 دقیقه بازدید کردن تایمش به الان آپدیت بشه و همچنین refrer که در چه ادرسی وجود داره.
که این آپدیت مشکل ساز شده و فشار زیادی روی سرور میاره.
کد آپدیت

mysql_query("Update online Set time = '$time_o' , ref = '$loc' Where ip = '$ip' ");

راهی غیر از آپدیت هست که بشه فشار کوئری رو کم کرد.
یا کوئری که بهینه تر باشه.
ممنون میشم دوستان راهنمایی کنن و اگر کدی مد نظرشون هست نمونه بزارن.

SilverLearn
شنبه 23 شهریور 1392, 19:28 عصر
به نظر من برای همچین موردی استفاده از سشن مناسب تره ... و نیازی هم به ثبت آی پی و ... نیست

یه مثال برات میزنم »

اول یه جدول میسازیم :



CREATE TABLE `user_online` (
`session` char(100) NOT NULL default '',
`time` int(11) NOT NULL default '0'
) TYPE=MyISAM;


بعد فایلی که می خوایم آنلاین ها رو نشون بده :



############### Code


<?php

session_start();
$session=session_id();
$time=time();
$time_check=$time-600; //SET TIME 10 Minute


$host="localhost"; // Host name
$username=""; // Mysql username
$password=""; // Mysql password
$db_name="test"; // Database name
$tbl_name="user_online"; // Table name


// Connect to server and select databse
mysql_connect("$host", "$username", "$password")or die("cannot connect to server");
mysql_select_db("$db_name")or die("cannot select DB");
$sql="SELECT * FROM $tbl_name WHERE session='$session'";
$result=mysql_query($sql);


$count=mysql_num_rows($result);
if($count=="0"){

$sql1="INSERT INTO $tbl_name(session, time)VALUES('$session', '$time')";
$result1=mysql_query($sql1);
}

else {
"$sql2=UPDATE $tbl_name SET time='$time' WHERE session = '$session'";
$result2=mysql_query($sql2);
}


$sql3="SELECT * FROM $tbl_name";
$result3=mysql_query($sql3);
$count_user_online=mysql_num_rows($result3);
echo "User online : $count_user_online ";


// if over 10 minute, delete session
$sql4="DELETE FROM $tbl_name WHERE time<$time_check";
$result4=mysql_query($sql4);


// Open multiple browser page for result


// Close connection
mysql_close();
?>

tem988
شنبه 23 شهریور 1392, 19:52 عصر
خوب این کدی که شما نوشتید باز هم با هر بار لود شدن صفحه query Update اجرا میشه و باز هم فشار میاره.
میخوام کدی باشه بهینه تر باشه و فشار روی سرور رو کمتر کنه.
کد منم دقیقا عین کد شماست فرقش اینه شما توی سشن میریزید ولی من مستقیم میگیریم REMOTE_ADDER
ولی به هر حال کوئری بازم مثل قبل اجرا میشه و بهینه نیست.

SilverLearn
شنبه 23 شهریور 1392, 20:25 عصر
درسته ....
خوب می تونید از دیتابیسی نظیر فایل استفاده کنید....

یعنی اطلاعات را در یک فایل ذخیره کنید

این جوری فکر کنم بهتر باشه ...

tem988
شنبه 23 شهریور 1392, 20:32 عصر
نمونه ای سراغ دارید که دیتابیس با فایل باشه ؟
البته مثل دیتابیس قابلیت order و where هم داشته باشه.
چون این انلاین برای سرویس وبلاگ دهی هست و انلاین هر وبلاگ باید سلکت بشه.
و همچنین بر اساس تاریخ بازدید لیست میشن و ....

SilverLearn
شنبه 23 شهریور 1392, 20:42 عصر
خوب دوست عزیز شما می تونید از لینک زیر نحوه کار با فایل رو ببینید

http://developer1.ir/PHP/file.aspx

در مورد where و order هم موردی نداره شما می تونید از یک جدا کننده برای هر رکورد استفاده کنید و اطلاعات ذخیره شده رو از همدیگر متمایز کنی و سپس با یک سرچ در فایل (تا زمانی که فایل به انتها نرسیده (استفاده از حلقه ) ) به اطلاعات مورد نظر دسترسی داشته باشید

SilverLearn
شنبه 23 شهریور 1392, 20:48 عصر
این هم یک نمونه کاملا خوب برای کار با فایل برای افراد آنلاین :)



<?php

$ip = $REMOTE_ADDR; // $REMOTE_ADDR gets the users ip address
$time = time(); // this adds the time of day to the script,,,
$minutes = 1; // the count of the minutes for how long
$found = 0; // how many users found, aka: ip address for start
$users = 0; // number of users determined for start
$user = ""; // users know already,,, aka: no users yet

if (!is_file("online.txt")) // text file used for figuring how man users online.
{
$s = fopen("online.txt","w"); //creates file if not one
fclose($s);
chmod("online.txt",0666); // chmod filt
}

$f = fopen("online.txt","r+"); // opens file
flock($f,2);

while (!feof($f))
{
$user[] = chop(fgets($f,65536));
}

fseek($f,0,SEEK_SET);
ftruncate($f,0);

foreach ($user as $line) // configures each user, no doubles
{
list($savedip,$savedtime) = split("\|",$line);
if ($savedip == $ip) {$savedtime = $time;$found = 1;}
if ($time < $savedtime + ($minutes * 60))
{
fputs($f,"$savedip|$savedtime\n");
$users = $users + 1;
}
}

if ($found == 0) // writes to file
{
fputs($f,"$ip|$time\n");
$users = $users + 1;
}

fclose ($f);
print 'Users Viewing Site : '.$users;

?>



همونطور که گفتم از جدا کننده | برای متمایز کردن رکورد ها استفاده شده ...

نکته :

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



chmod("online.txt",0666); // chmod filt

shahriyar3
شنبه 23 شهریور 1392, 21:36 عصر
2 مدل کوئری داریم البته بجز mysql_query چون دیگه ساپورت نمیشه. باید از pdo یا mysqli استفاده کنی
مدل اول کوئری های بافر شده هستند که حجم زیادی از حافظه رو به محض اینکه کوئری اجرا میشه اشغال میکنند مثل همین مدلی که شما نوشتید
و مدل دوم کوئری های بافر نشده هستند که بعد از اجرای کوئری فقط resource کوئری رو برمیگردونن و برای داشتن خروجی از کوئری باید دوباره به دیتابیس وصل بشید.
mysql در حالت پیش فرض از کوئری های بافر شده استفاده میکنه. اگر میخوای مقدار حافظه مصرفی رو کم کنی باید از کوئری های بافر نشده استفاده کنی.
در کل من با ذخیره اطلاعات در فایل موافق نیستم .
ولی یه سری نکته هست که خیلی روی سرعت و پرفرمنس تاثیر داره باید همشو رعایت کنی تا فشار کمتری به سرور بیاد که به نظر اصلا رعایت نکردی!!

ravand
شنبه 23 شهریور 1392, 21:36 عصر
اگه میخوای تعداد افراد انلاین رو در دیتابیس ثبت کنی خوبه که آی پی رو هم ثبت کنی . اینطوری طرف برای بار بعد که وارد سایت شد برنامه تشخیص بده و یه آمار جدید ثبت نشه. هر چند که با قطع شدن اینترنت بازم مشکل پیش میاد.