Statistika přístupů v PHP – detekce operačního systému
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.
Mohlo by vás také zajímat
-
10 nejpopulárnějších programovacích jazyků a jejich využití
9. listopadu 2023 -
Optimalizace a zlepšení výkonu kódu: tipy a triky
14. srpna 2023 -
4 tipy, jak na efektivní úsporu při rozjezdu podnikání
3. ledna 2023
Nejnovější
-
Windows App: Pracujte odkudkoliv, kdykoliv
3. listopadu 2024 -
Od iPhonu po Android: Ultra HDR přináší nový standard fotografií
1. listopadu 2024 -
AI a internetové podvody
29. října 2024 -
Užitečné nástroje pro bezpečnost na internetu
17. října 2024