نظر شما درباره اين آموزش
عالي
50.00%
1
خوب
50.00%
1
متوسط
0%
0
ضعيف
0%
0
بد
0%
0
2 رای
* چنانچه به گزینه‌ای رای داده اید، با علامت ستاره مشخص گردیده است. [نمایش نتایج]

  • 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
آموزش شمارنده آمار بازديد
#1
Lightbulb 
با سلام، دوستان گرامي خواستم بعد از اينهمه آموزش ساخت كد شمارنده سايت كه هر كدوم يك روش رو پيشنهاد ميكنن، من هم روش خودم رو بگم كه چند ساله دارم استفاده ميكنم و علاوه به انعطاف پذيري بالايي كه داره، حجم ديتابيس رو هم بالا نميبره. خوب مستقيم ميريم سراغ كد:
کد پی‌اچ‌پی:
<?php
require_once("config.php");
$agent=$_SERVER["HTTP_USER_AGENT"];
if((
ereg("Nav",$agent)
    || 
ereg("Gold",$agent)
    || 
ereg("X11",$agent)
    || 
ereg("Netscape",$agent))
    && !
ereg("MSIE",$agent)
    && !
ereg("Mozilla",$agent)
    && !
ereg("Konqueror",$agent)) $browser "Netscape";
elseif(
ereg("Mozilla",$agent)
    || 
eregi("FireFox",$agent)
    || 
eregi("Bon.Echo",$agent)
    && !
ereg("MSIE",$agent)) $browser "FireFox";
elseif(
ereg("MSIE",$agent)) $browser "MSIE";
elseif(
ereg("Lynx",$agent)) $browser "Lynx";
elseif(
ereg("Opera",$agent)) $browser "Opera";
elseif(
ereg("WebTV",$agent)) $browser "WebTV";
elseif(
ereg("Konqueror",$agent)) $browser "Konqueror";
elseif(
eregi("google",$agent)) $browser "Chrome";
elseif(
eregi("bot",$agent)
    || 
ereg("Slurp",$agent)
    || 
ereg("Scooter",$agent)
    || 
eregi("Spider",$agent)
    || 
eregi("Infoseek",$agent)) $browser "Bot";
else 
$browser "Other";
if(
ereg("Win",$agent)) $os "Windows";
elseif((
ereg("Mac",$agent))
    || (
ereg("PPC",$agent))) $os "Mac";
elseif(
ereg("Linux",$agent)) $os "Linux";
elseif(
ereg("FreeBSD",$agent)) $os "FreeBSD";
elseif(
ereg("SunOS",$agent)) $os "SunOS";
elseif(
ereg("IRIX",$agent)) $os "IRIX";
elseif(
ereg("BeOS",$agent)) $os "BeOS";
elseif(
ereg("OS/2",$agent)) $os "OS/2";
elseif(
ereg("AIX",$agent)) $os "AIX";
else 
$os "Other";
try
{
    
mysql_connect($host,$user,$pass);
    
mysql_select_db($db);
    
$query="UPDATE `counter` SET `count`=`count`+1"
    
$query.=" where (`type`='Total' AND `var`='Hits')"
    
$query.=" OR (`type`='Browser' AND `var`='$browser')"
    
$query.=" OR (`type`='OS' AND `var`='$os')";
    
$result=mysql_query($query);
}
catch(
Exception $error)
{
    die(
$error->getMessage()."\n");

توي كد بالا، همونطور كه ميبينيد، هم تعداد كلي بازديد و هم آمار تفكيكي برحسب نوع مرورگر و نوع سيستم عامل استخراج ميشه و به ركوردهاي مربوطه اضافه ميشه. تنها كار باقيمانده، كد MySQL مربوط به جداول هست:
کد:
CREATE TABLE `counter` (
  `ID` int(11) NOT NULL,
  `Type` longtext collate utf8_bin NOT NULL,
  `Var` longtext collate utf8_bin NOT NULL,
  `Count` int(11) NOT NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

INSERT INTO `counter` (`ID`, `Type`, `Var`, `Count`) VALUES
(1, 'Total', 'Hits', 0),
(2, 'Browser', 'Netscape', 0),
(3, 'Browser', 'FireFox', 0),
(4, 'Browser', 'MSIE', 0),
(5, 'Browser', 'Lynx', 0),
(6, 'Browser', 'Opera', 0),
(7, 'Browser', 'WebTV', 0),
(8, 'Browser', 'Konqueror', 0),
(9, 'Browser', 'Chrome', 0),
(10, 'Browser', 'Bot', 0),
(11, 'Browser', 'Other', 0),
(12, 'OS', 'Windows', 0),
(13, 'OS', 'Mac', 0),
(14, 'OS', 'Linux', 0),
(15, 'OS', 'FreeBSD', 0),
(16, 'OS', 'SunOS', 0),
(17, 'OS', 'IRIX', 0),
(18, 'OS', 'BeOS', 0),
(19, 'OS', 'OS/2', 0),
(20, 'OS', 'AIX', 0),
(21, 'OS', 'Other', 0);
اميدوارم كه خوشتون بياد. ضمناً خوشحال ميشم نظراتتون رو بدونم.
موفق و مؤيد باشيد.
  پاسخ
تشکر شده توسط : s8990
#2
چون دستور افزایش شمارنده ها رو توسط خود MySQL انجام میدی بنظرم از نظر تداخل در دسترسی همزمان مشکلی نداره. این مسئلهء مرحلهء اول بود که تاحالا تمام شمارنده هایی که بنده دیدم و توسط افراد معرفی و پیشنهاد شدن در این زمینه اشکال داشتن.

اما از جنبه های دیگه و آماری که میگیری هم اینم روشی هست بالاخره! ولی بنده به جهت سادگی و انعطاف بیشتر، ترجیح میدم آمار رو بصورت خام در جدول درج کنم، گرچه حجم ذخیره سازی بیشتری مصرف میکنه؛ در بیشتر سایتهای با ترافیک معمولی و حتی نسبتا زیاد فکر نمیکنم این حجم ذخیره سازی حتی در تمام طول عمر سایت هم مشکلی ایجاد بکنه (اگر هم ایجاد کرد بالاخره قابل حل هست).

ببین مثلا در کدهای شما درصورتیکه مرورگر از انواعی که شما تعریف کردی نباشه بجاش other مینویسه. یعنی بعدا شما USER_AGENT رو نداری که بتونی بفهمی اون چه مرورگری بوده. اگر مرورگر جدیدی هم بیاد، شما باید کدت رو تغییر بدی تا مرورگر جدید رو هم بصورت مجزا ثبت کنی. درحالیکه اگر اطلاعات USER_AGENT رو بصورت خام و کامل درج کنی، هیچکدام از این مشکلات رو نداره و انعطاف بیشتری هم بهت میده. میتونی منطق دسته بندی و نمایش آمارت رو بجای اینکه از ابتدا در دیتابیس درج کنی، در یک برنامهء PHP که اطلاعات خام رو از دیتابیس میخونه و دسته بندی و برای نمایش و مطالعه فرمت میکنه انجام بدی. به اینصورت مثلا اون مرورگرهایی رو که تشخیص نمیده میتونه با تعدادشون به ازای هر USER_AGENT درج کنه و غیره. برنامهء PHP مذکور میتونه کارهای دیگری رو هم مثل زیردسته بندی و کارهایی مثل نمایش درصد کاربران هر نسخهء خاص از یک مرورگر خاص نسبت به کل کاربران اون مرورگر، اگر خواستید یا بعدا نیاز شد انجام بده.

راستی در الگوریتم شما هیچ نیازی نیست از توابعی مثل ereg که در اصل برای پردازش با Regular expression ها هستن استفاده کنی. بلکه میتونی بجاش از توابع جستجوی ساده در رشته استفاده کنی که سرعت بیشتر و مصرف منابع کمتری دارن. البته ممکنه چنین بهینه سازیهایی در داخل توابع مربوط به Regular expression هم پیاده شده باشن که بصورت هوشمند تشخیص بده رشتهء شما نیازی به پردازش از طریق موتور Regular expression نداره و به این شکل مقدار زیادی از بار پردازش اضافی رو کم کنن، ولی بهرحال بهتره از توابع جستجوی ساده استفاده کنید.
  پاسخ
تشکر شده توسط : s8990
#3
با سلام، ضمن تشكر از نظرات سازنده شما، اين موارد رو در نسخه بعد رفع خواهم كرد. اين نكته رو هم بگم كه با وجود سرورهاي قدرتمند امروزي، تفاوت خيلي زيادي ازنظر سرعت بين RegEx و جستجوي ساده در رشته وجود نداره. بخصوص اينكه ساختار RegEx در نسخه 5.3 زبان PHP تحول خيلي زيادي داشته. در نسخه بعدي اين توابع رو با توابع RegEX زبان Perl جايگزين خواهم كرد كه سرعت بسيار بيشتري خواهد داشت.
  پاسخ
تشکر شده توسط : s8990


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان