Statistika přístupů v PHP – detekce operačního systému

30. ledna 2004

V tomto článku navážeme na předchozí detekci prohlížečů a povíme si, jak zjistit další údaj o návštěvníkovi – použitý operační systém. Na závěr provedeme vyhodnocení údajů o prohlížečích, jejich nadstavbách a operačních systémech, včetně jednoduchého grafického znázornění.

Hotovou aplikaci si jako obvykle můžete prohlédnout a vyzkoušet. V této ukázkové verzi se provádí statistika přístupů stránek http://www.czechia.cz/help/.

Postup, jakým budeme zjišťovat informaci o operačním systému, je velmi podobný postupu, kterým jsme zjišťovali údaje o prohlížeči. Z předchozího článku víme, že hlavička User-Agent obsahuje kromě informací o prohlížeči i informaci o platformě, na které prohlížeč běží. Detekce operačního systému je však o trošku komplikovanější než detekce prohlížečů. Většina operačních systémů (OS) se totiž hlásí několika různými způsoby, což je uvedeno v následující tabulce:

OS Příklad hlavičky
Windows ME Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)
Windows ME Opera/6.0 (Windows ME; U) [cs]
Windows 98 Mozilla/4.75 [en] (Win98; U)
Windows 98 Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
Windows 98 Mozilla/4.0 (compatible; Opera/3.0; Windows 4.10) 3.50
Windows 95 Mozilla/4.0 (compatible; MSIE 5.5; Windows 95)
Windows 95 Mozilla/4.05 [en] (Win95; I)
Windows 2000 Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 6.0 [cs]
Windows 2000 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Windows XP Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Windows XP Mozilla/4.0 (compatible; MSIE 5.0; Windows XP) Opera 6.0 [cs]
Windows NT Mozilla/4.0 (compatible; MSIE 5.01; Windows NT)
Windows NT Mozilla/4.5 [en] (WinNT; I)
Windows NT Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:0.9.2)
Macintosh Mozilla/4.0 (compatible; MSIE 5.0; Mac_PowerPC)
Macintosh Mozilla/4.5 (compatible; iCab Pre2.2; Macintosh; I; PPC)
Windows 3.x Mozilla/2.0 (Win16; I)
Windows 3.x Mozilla/2.0 (compatible; MSIE 3.02; Windows 3.1)
Linux Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.6+) Gecko/20011122
SunOS Mozilla/4.7 [en] (X11; I; SunOS 5.5.1 sun4m)

Z tabulky opět vyplývá nutnost dodržet při detekci určité pořadí. Například detekce Windows ME musí být provedena dříve než detekce Windows 98, protože hlavička s Windows ME často obsahuje i text Windows 98. Obdobně Windows 2000 a XP musí být dříve než Windows NT, atd.

Tabulka operačních systémů

Veškeré údaje o operačních systémech uložíme do tabulky os, kterou vytvoříme pomocí tohoto SQL dotazu:

CREATE TABLE os (
  id int(11) NOT NULL,
  name varchar(50) NOT NULL,
  os_regexp varchar(70) NOT NULL,
  PRIMARY KEY (id)
)

  • id – unikátní označení každého operačního systému (primární klíč)
  • name – název operačního systému
  • os_regexp – regulární výraz zjišťující daný OS

Při vkládání záznamů do tabulky musíme dodržet pořadí, o kterém jsem se před chvílí zmínil. Z důvodů objasněných v předchozím článku píšeme v položce os_regexp místo mezer metaznak „.“. To, že se každý operační systém může představit několika způsoby, vyřešíme velmi snadno – použitím metaznaku „|“. Text poté vyhovuje regulárnímu výrazu, pokud vyhovuje alespoň jedné jeho části.

id name os_regexp
0 Jiný, nezjištěno  
1 Windows ME win.9x.4\.90|windows.me
2 Windows 98 windows.98|win98|windows.4\.10
3 Windows 95 windows.95|win95
4 Windows 2000 windows.nt.5\.0|windows.2000
5 Windows XP windows.xp|windows.nt.5\.1
6 Windows NT windows.nt|winnt
7 Macintosh mac
8 Linux linux
9 Windows 3.x win16|win3\.|windows.3\.
10 Unix unix
11 BeOS beos
12 SunOS sunos
13 HP-UX hp-ux
14 OSF osf
15 IRIX irix
16 FreeBSD freebsd
17 OpenBSD openbsd
18 OS/2 os/2
19 Windows CE windows.ce
50 Windows (ostatní) win

Detekci operačního systému provedeme obdobně jako detekci prohlížeče použitím regulárního výrazu přímo v SQL dotazu. Do proměnné $os se uloží id operačního systému. Obsah této proměnné se v závěru celého skriptu uloží do tabulky access, konkrétně do položky os.

// OS
$query = mysql_query(„SELECT id FROM os WHERE ‚$http_user_agent‘ REGEXP os_regexp ORDER BY id LIMIT 0,1“);
if ($result = mysql_fetch_array($query))
  $os = $result[‚id‘];
else
  $os = 0;

Vyhodnocení údajů o prohlížečích a operačních systémech

Výslednou statistiku zapíšeme do tabulky o třech třech sloupcích – Název prohlížeče nebo OS, Počet přístupů s daným softwarem a Podíl v procentech + grafické znázornění.

// BROWSERY
echo ‚<h2>Prohlížeče</h2>‘;
echo ‚<table width=“430″ cellspacing=“0″>‘;
echo ‚<tr><th>Název</th><th>Počet</th><th>Podíl</th></tr>‘;

Nyní musíme z tabulky access získat statistiku prohlížečů za dané období ($sql_access_date), k čemuž potřebujeme pouze dva údaje – název prohlížeče a počet přístupů s tímto prohlížečem. Vše provedeme spojením tabulek browser a access, kde položka id v tabulce browser je primárním klíčem a položka browser v tabulce access cizím klíčem (obsahuje primární klíče z tabulky browser). Záznamy sdružíme do skupin určených položkou browser (unikátní označení prohlížeče) a seřadíme sestupně (DESC) podle zastoupení jednotlivých prohlížečů. Obdobný postup budeme využívat i v dalších článcích, takže pokud vám není spojování tabulek a použití agregačních funkcí (například count) úplně jasné, nastudujte si články Dotazy v jazyce SQL (II.) a Dotazy v SQL s agregací.

Jelikož budeme podíl jednotlivých prohlížečů znázorňovat i graficky, musíme vědět, kolik přístupů bylo zaznamenáno s nejpoužívanějším prohlížečem. To zjistíme použitím funkce mysql_result(), kde první parametr označuje výsledek, druhý číslo záznamu a třetí název položky, přičemž záznamy jsou číslovány od nuly. Protože se záznamy z databáze budeme ještě pracovat, musíme pomocí funkce mysql_data_seek() přesunout ukazatel výsledku na první záznam.

// vybirame browsery podle jejich zastoupeni
$query = mysql_query(„SELECT name, count(browser) AS count_it FROM access JOIN browser ON (browser = browser.id) WHERE $sql_access_date GROUP BY browser ORDER BY count_it DESC“);
$max = mysql_result($query, 0, ‚count_it‘) // pocet pristupu s nejpouzivanejsim browserem
$move = mysql_data_seek($query, 0) // presuneme se znovu na zacatek

Konečně můžeme začít se zápisem dat do tabulky. U každého prohlížeče musíme vypočítat šířku obrázku znázorňujícího podíl daného prohlížeče. To provedeme použitím matematické trojčlenky, kde obrázek u prohlížeče s největším podílem bude mít šířku 200 bodů. Snadno dopočítáme i procentuální podíl přístupů s daným prohlížečem na celkovém počtu přístupů za dané období ($viewpages). Získané údaje poté zapíšeme do tabulky.

while($result = mysql_fetch_array($query)) {
  $width = round($result[‚count_it‘]/$max*200); // sirka obrazku znazornujiciho podil
  $rate = sprintf(‚%.2f‘, $result[‚count_it‘]/($pageviews/100)); // podil v procentech
  echo ‚<tr><td>‘ . $result[‚name‘] . ‚</td><td>‘ . $result[‚count_it‘] . ‚</td><td><img src=“1.gif“ width=“‚ . $width . ‚“ height=“8″ alt=““ /> ‚ . $rate . ‚ %</td></tr>‘;
}
echo „</table>\n\n“;

Stejně jako statistiku prohlížečů vytvoříme i statistiku operačních systémů.

// OPERACNI SYSTEMY
echo ‚<h2>Operační systémy</h2>‘;
echo ‚<table width=“430″ cellspacing=“0″>‘;
echo ‚<tr><th>Název</th><th>Počet</th><th>Podíl</th></tr>‘;
// vybirame operacní systemy podle jejich zastoupeni
$query = mysql_query(„SELECT name, count(os) AS count_it FROM access JOIN os ON (os = os.id) WHERE $sql_access_date GROUP BY os ORDER BY count_it DESC“);
$max = mysql_result($query, 0, ‚count_it‘); // pocet pristupu s nejpouzivanejsim operacnim systemem
$move = mysql_data_seek($query, 0); // presuneme se znovu na zacatek
while($result = mysql_fetch_array($query)) {
  $width = round($result[‚count_it‘]/$max*200); // sirka obrazku znazornujiciho podil
  $rate = sprintf(‚%.2f‘, $result[‚count_it‘]/($pageviews/100)); // podil v procentech
  echo ‚<tr><td>‘ . $result[‚name‘] . ‚</td><td>‘ . $result[‚count_it‘] . ‚</td><td><img src=“1.gif“ width=“‚ . $width . ‚“ height=“8″ alt=““ /> ‚ . $rate . ‚ %</td></tr>‘;
}
echo „</table>\n\n“;

Podobně jako předcházející statistiky vytvoříme i statistiku nadstaveb prohlížečů. S ní si však pohrajeme o trošku víc. Nebudeme totiž vytvářet pouze statistiku dle použité nadstavby, ale i dle použitého prohlížeče. Je to dobrá ukázka toho, jak lze spojovat více tabulek, jejíž význam navíc vzroste, až bude více nadstaveb využívat různá renderovací jádra, jak je tomu například u MyIE2.

// BROWSERY – nadstavby
$query = mysql_query(„SELECT count(id) FROM access WHERE $sql_access_date AND brow_add_on <> 0“);
$result = mysql_fetch_array($query);
$count_add_on = $result[‚count(id)‘];
if($count_add_on != 0) {
  echo ‚<h2>Prohlížeče – nadstavby</h2>‘;
  echo ‚<table width=“480″ cellspacing=“0″>‘;
  echo ‚<tr><th>Prohlížeč</th> <th>Nadstavba</th><th>Počet</th> <th>Podíl</th></tr>‘;
  $width = round($count_add_on/$pageviews*200); // sirka obrazku znazornujiciho podil
  $rate = sprintf(‚%.2f‘, $count_add_on/($pageviews/100)); // podil v procentech
  echo ‚<tr class=“tableheader“><td colspan=“2″>Celkem</td><td>‘ . $count_add_on . ‚/‘. $pageviews . ‚</td><td><img src=“1.gif“ width=“‚ . $width . ‚“ height=“8″ alt=““ /> ‚ . $rate . ‚ %</td></tr>‘;
   // vybirame nadstavby podle jejich zastoupeni
  $query = mysql_query(„SELECT browser.name AS browser_name, browser_add_on.name AS add_on, count(browser) AS count_it FROM access JOIN browser ON (browser = browser.id) JOIN browser_add_on on (brow_add_on = browser_add_on.id) WHERE $sql_access_date GROUP BY browser, brow_add_on ORDER BY count_it DESC“);
  $max = mysql_result($query, 0, ‚count_it‘); // pocet pristupu s nejpouzivanejsi nadstavbou
  $move = mysql_data_seek($query, 0); // presuneme se znovu na zacatek
  while($result = mysql_fetch_array($query)) {
    $width = round($result[‚count_it‘]/$pageviews*200); // sirka obrazku znazornujiciho podil
    $rate = sprintf(‚%.2f‘, $result[‚count_it‘]/($pageviews/100)); // podil v procentech
    echo ‚<tr><td>‘ . $result[‚browser_name‘] . ‚</td><td>‘ . $result[‚add_on‘] . ‚</td><td>‘ . $result[‚count_it‘] . ‚</td><td><img src=“1.gif“ width=“‚ . $width . ‚“ height=“8″ alt=““ /> ‚ . $rate . ‚ %</td></tr>‘;
  }
  echo „</table>\n\n“;
}

Tímto máme zvládnuto vše o prohlížečích a operačních systémech.

Odkazy, zdroje

  • RFC 2616 – kapitola 14.43 obsahuje kratičkou zmínku o hlavičce User-Agent
  • User Agents – více než deset tisíc různých hlaviček User-Agent

Pozn. red.: Tento článek vyšel poprvé 30. 5. 2002. Původní verze článku a k němu vedené diskuse jsou vám k dispozici v ZIP archivech.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Předchozí článek salto.cz
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *