- Что PHP может узнать о браузере посетителя?
- Предистория
- Как можно узнать что-либо о браузере клиента
- Что же делать
- Скрипт записи логов посещений Вашего сайта
- PHP statistics User Agent data of Nginx log
- Hot Tags
- How to Store Visitor Activity Log in the MySql Database Using PHP
- Are you want to get implementation help, or modify or extend the functionality of this script?
- Store Visitor Activity Log in the MySql Database
- Step-1: Create Database Tablel
Что PHP может узнать о браузере посетителя?
Возможно ли узнать более детальную информацию о браузере посетителя кроме строки, содержащейся в $_SERVER[«HTTP_USER_AGENT»]: поддерживает ли яву, апплеты, таблицы стилей и фреймы? А может это вообще гуглобот зашел?
Предистория
Захотелось заказчику, чтобы при заходе на сайт отображался его любимый логотип с пробегающей по нему искоркой света… Уговорить отказаться от этой идеи человека я так и не смог, но в итоге мы решили, что радость эта будет отображаться только раз, и только при заходе на главную страницу. Если человек попал на сайт с поисковика, он сразу переходит на страницу. Если он руками вписывает адрес в браузер, он перенаправляется на страницу с анимацией. После успешного отображения в куки пишется маркер, и видео больше не грузится. Но… Если на сайт зайдет не человек, а поисковик, то писать себе куки он не будет. Поэтому он всегда будет натыкаться на страницу с анимацией, и в выдаче поисковиков мы себя так и не увидим. Да и зачем поисковику логотип компании видеть 🙂
Как можно узнать что-либо о браузере клиента
Проблема в итоге была решена методом поиска подстроки имен пауков нескольких известных поисковиков в переменной $_SERVER[«HTTP_USER_AGENT»]. Но перед этим я походил по ману и обнаружил интересную функцию get_browser(). Она умеет выдавать массив параметров браузера гостя нашего сайта, назначения половины которых, правда, я так и не понял 🙂 Единственная тонкость работы этой функции в том, что она требует наличия на хосте свежей версии файла browscap.ini, а также настройки php.ini. Очевидно что нашим ленивым (просьба не обижаться) админам влом постоянно обновлять этот файлик, так что на это обычно забивают и функция попросту недоступна. Проверить это можно, заглянув в phpinfo(), отыскав там диррективу browscap, и ничуть не удивившись что напротив нее гордо красуется надпись «no value», приступить к прочтению следующего параграфа.
Что же делать
if(ini_get(‘browscap’))
//неленивые админы попались
/* старт шутки */
//вероятность выполнение участка кода стремится к нулю поэтому пишем сюда
echo «Начальство — ты меня задрало!»;
/* конец шутки — всем смеяться :)*/
>
else
//используем нашу библиотеку
require_once(‘browscap.php’);
$bc = new Browscap(‘path/to/the/cache/dir’);
$browserInfo=$bc->getBrowser();
в результате чего получим примерно следующее
stdClass Object
(
[browser_name] => Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.18
[browser_name_regex] => ^mozilla/5\.0 \(macintosh; .; .*mac os x.*\) applewebkit/.* \(.*\) version/3\.1.* safari/.*$
[browser_name_pattern] => Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.1* Safari/*
[Parent] => Safari 3.1
[Platform] => MacOSX
[Browser] => Safari
[Version] => 3.1
[MajorVer] => 3
[MinorVer] => 1
[Frames] => 1
[IFrames] => 1
[Tables] => 1
[Cookies] => 1
[BackgroundSounds] => 1
[JavaApplets] => 1
[JavaScript] => 1
[CSS] => 2
[CssVersion] => 2
[supportsCSS] => 1
[Alpha] =>
[Beta] =>
[Win16] =>
[Win32] =>
[Win64] =>
[AuthenticodeUpdate] =>
[CDF] =>
[VBScript] =>
[ActiveXControls] =>
[Stripper] =>
[isBanned] =>
[WAP] =>
[isMobileDevice] =>
[isSyndicationReader] =>
[Crawler] =>
[AOL] =>
[aolVersion] => 0
[netCLR] =>
[ClrVersion] => 0
)
UPD. Полученные данные свидетельствуют лишь о поддержке браузером некоторой технологии, а не о ее доступности, так как файл browscap.ini это по сути база данных всех веб-клиентов, в которой по значению User-Agent браузера предоставляется информация о поддерживаемых этим браузером технологиях. Тоесть для современных браузеров при отключенных куках и яве соответствующие параметры все равно будут возвращать еденицу.
Куда применять эту функцию, надеюсь, каждый найдет для себя сам 🙂
Скрипт записи логов посещений Вашего сайта
При работе над сайтом бывает очень полезно проанализировать логи посещений Вашего сайта. Таким образом, можно узнать, как часто Ваш сайт посещают поисковые роботы, и какие переходы по сайту осуществляют пользователи. Но, например, при использовании бесплатного хостинга, функция доступа к log-файлам не предоставляется. Так как же быть в подобных случаях вебмастерам?
Предлагаем Вам написать свой собственный скрипт, который будет записывать все переходы на Вашем сайте в специальный файл, расположенный на сервере, который потом можно будет просмотреть и проанализировать.
Данный скрипт будет полезен для тех, кто пользуется хостингом без предоставления доступа к log-файлам. Для работы скрипта необходима поддержка хостингом PHP. Добавляете данный PHP код в начало страниц, при посещении которых будут писаться логи:
$file = «base.log» ; //куда пишем логи
$col_zap = 4999 ; //строк в файле не более
?>
function getRealIpAddr () if (!empty( $_SERVER [ ‘HTTP_CLIENT_IP’ ])) // Определяем IP
< $ip = $_SERVER [ 'HTTP_CLIENT_IP' ]; >
elseif (!empty( $_SERVER [ ‘HTTP_X_FORWARDED_FOR’ ])) // Если IP идёт через прокси
< $ip = $_SERVER [ 'HTTP_X_FORWARDED_FOR' ]; >
else < $ip = $_SERVER [ 'REMOTE_ADDR' ]; >
return $ip ;
>
if ( strstr ( $_SERVER [ ‘HTTP_USER_AGENT’ ], ‘YandexBot’ )) < $bot = 'YandexBot' ;>
elseif ( strstr ( $_SERVER [ ‘HTTP_USER_AGENT’ ], ‘Googlebot’ )) < $bot = 'Googlebot' ;>
else
$ip = getRealIpAddr ();
$date = date ( «H:i:s d.m.Y» ); //дата события
$home = $_SERVER [ ‘HTTP_HOST’ ] . $_SERVER [ ‘REQUEST_URI’ ]; //какая страница сайта
$lines = file ( $file );
while( count ( $lines ) > $col_zap ) array_shift ( $lines );
$lines [] = $date . «|» . $bot . «|» . $ip . «|» . $home . «|\r\n» ;
file_put_contents ( $file , $lines );
?>
Либо, если у Вас на каждой страничке подгружается какой-нибудь php-файл через include, то поместите данный выше код в тот самый подгружаемый php-файл.
Для просмотра результатов лога, создайте php-файл с любым названием и поместите в него следующий PHP код:
if (isset( $_GET [ col ])) $col = $_GET [ col ];
else $col = 50 ;
$file = file ( «base.log» ); ?>
?>
При обращении к файлу просмотра результатов лога, на экране будет отображаться примерно такая табличка:
Время, дата | Кто посещал | IP, прокси | Посещенный URL |
19:08:40 04.11 | Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) | 211.11.11.11 | /log_info.php |
19:06:19 04.11 | Mozilla/4.0 (Windows 98; US) Opera 10.00 [en] | 123.23.23.23 | /video_download.php |
19:00:06 04.11 | Mozilla/5.0 (Windows NT 6.1; rv:16.0) Gecko/20100101 Firefox/16.0 | 122.22.22.22 | current_time.php |
18:45:59 03.11 | Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.8.131 Version/11.11 | 111.11.11.11 | /script_menu_left.php |
18:45:59 03.11 | Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.8.131 Version/11.11 | 111.11.11.11 | /script_menu_left_example.php |
P.S. Из-за своей популярности и имеющегося спроса, данный скрипт был немного обновлен и теперь его более актуальная версия доступна по ссылке — Скрипт ведения логов посещения сайта.
PHP statistics User Agent data of Nginx log
The crawler is about to be used, so I plan to collect User Agent(UA) data. Then immediately think of their website access log is not ready-made high-quality data source? So I decided to write a script to count the UA information in the Nginx access log.
This kind of simple operation, with scripting language is enough, there is no doubt to use the most familiar PHP. Open vim and roll it up. After ten minutes, the simple statistical script is finished.
At present, the script has three functions: 1. Find and sort all UA information; 2. Count operating system data; 3. Count browser data. The screenshot of the program is as follows:
- UA information
- Operating system information
- Browser
Use the script to count the access logs of the last month and get the following results:
- Search engine crawlers are frequent, with thousands of data access every day;
- Windows is still the operating system with the largest share, and Linux Desktop still has a small share;
- Chrome is now the dominant browser, followed by Firefox and Opera.
Finally, the code of PHP script can be found in my Github: https://github.com/tlanyan/Sc.
#!/usr/bin/php <?php /** * @brief stat UA in access log * * @author tlanyan<tlanyan@hotmail.com> * @link http://tlanyan.me */ /* vim: set ts=4; set sw=4; set ss=4; set expandtab; */ function getFileList(string $path) : array < return glob(rtrim($path, "/") . "/*access.log*"); >function statFiles(array $files) : array < $stat = []; echo PHP_EOL, "start to read files. ", PHP_EOL; foreach ($files as $file) < echo "read file: $file . ", PHP_EOL; $contents = getFileContent($file); foreach ($contents as $line) < $ua = getUA($line); if (isset($stat[$ua])) < $stat[$ua] += 1; >else < $stat[$ua] = 1; >> > echo "stat all files done!", PHP_EOL, PHP_EOL; return $stat; > function getFileContent(string $file) : array < if (substr($file, -3, 3) === ".gz") < return gzfile($file); >return file($file); > function getUA(string $line) : ?string < // important! Nginx log format determins the UA location in the line! // You may have to refactor following codes to get the right result // UA starts from fifth double quote $count = 0; $offset = 0; while ($count < 5) < $pos = strpos($line, '"', $offset); if ($pos === false) < echo "Error! Unknown line: $line", PHP_EOL; return null; >$count ++; $offset = $pos + 1; > $end = strpos($line, '"', $offset); return substr($line, $offset, $end - $offset); > function usage() < echo "Usage: php statUA.php [option] [dir]", PHP_EOL; echo " options:", PHP_EOL; echo " -h: show this help", PHP_EOL; echo " -v: verbose mode", PHP_EOL; echo "-n NUM: UA list number", PHP_EOL; echo " dir: directory to the log files", PHP_EOL; echo PHP_EOL; >function filterUA(array& $stat, array $UAFilters) < $filterCount = 0; foreach ($UAFilters as $filter) < foreach ($stat as $ua => $count) < if (stripos($ua, $filter) !== false) < $filterCount += $count; unset($stat[$ua]); >> > echo "filter $filterCount records!", PHP_EOL; > function printCount(array $stat) < $sum = array_sum($stat); foreach ($stat as $key => $count) < echo $key, " : ", $count, ", percent: ", sprintf("%.2f", 100*$count/$sum), PHP_EOL; >> function statOS(array $UAs) : array < global $debug; echo PHP_EOL, "stat OS. ", PHP_EOL; $os = ["Windows", "MacOS", "Linux", "Android", "iOS", "other"]; $stat = array_fill_keys($os, 0); foreach ($UAs as $key => $count) < if (strpos($key, "Windows") !== false) < $stat["Windows"] += $count; >else if (strpos($key, "Macintosh") !== false) < $stat["MacOS"] += $count; // must deal Android first, then Linux >else if (strpos($key, "Android") !== false) < $stat["Android"] += $count; >else if (strpos($key, "Linux") !== false) < $stat["Linux"] += $count; >else if (strpos($key, "iPhone") !== false || strpos($key, "iOS") !== false || strpos($key, "like Mac OS") !== false || strpos($key, "Darwin") !== false) < $stat["iOS"] += $count; >else < if ($debug) < echo "other: $key, count: $count", PHP_EOL; >$stat["other"] += $count; > > return $stat; > function statBrowser(array $UAs) : array < global $debug; echo PHP_EOL, "stat brwoser. ", PHP_EOL; $browsers = ["Chrome", "Firefox", "IE", "Safari", "Edge", "Opera", "other"]; $stat = array_fill_keys($browsers, 0); foreach ($UAs as $key => $count) < if (strpos($key, "MSIE") !== false) < $stat["IE"] += $count; >else if (strpos($key, "Edge") !== false) < $stat["Edge"] += $count; >else if (strpos($key, "Firefox") !== false) < $stat["Firefox"] += $count; >else if (strpos($key, "OPR") !== false) < $stat["Opera"] += $count; // first Chrome, then Safari >else if (strpos($key, "Chrome") !== false) < $stat["Chrome"] += $count; >else if (strpos($key, "Safari") !== false) < $stat["Safari"] += $count; >else < if ($debug) < echo "other: $key, count: $count", PHP_EOL; >$stat["other"] += $count; > > return $stat; > function parseCmd() < global $debug, $num, $path, $argc, $argv; $optind = null; $options = getopt("hvn:", [], $optind); if ($argc > 2 && empty($options)) < usage(); exit(1); >if (isset($options['h'])) < usage(); exit(0); >if (isset($options['v'])) < $debug = true; >if (isset($options['n'])) < $num = intval($options['n']); if ($num <= 0) < $num = 10; >> if ($argc === 2 && empty($options)) < $path = $argv[1]; >if ($argc > $optind) < $path = $argv[$optind]; >if (!is_dir($path)) < echo "invalid directory: $path", PHP_EOL; exit(1); >if ($debug) < echo "num: $num", PHP_EOL; echo "verbose: ", var_export($debug, true), PHP_EOL; echo "path: $path", PHP_EOL; >> if (version_compare(PHP_VERSION, "7.1") < 0) < exit("scripts require PHP >=7.1"); >$path = "."; $debug = false; $num = 10; $UAFilters = [ "spider", "bot", "wget", "curl", ]; parseCmd(); $files = getFileList($path); if (empty($files)) < echo '"' . realpath($path) . '" does not contain access log files.', PHP_EOL; exit(0); >$allUA = statFiles($files); if (empty($allUA)) < echo "no data", PHP_EOL; exit(0); >filterUA($allUA, $UAFilters); // sort array with count uasort($allUA, function ($a, $b) < return $b - $a; >); if ($debug) < print_r($allUA); >echo PHP_EOL, "---- top $num UA ----", PHP_EOL; printCount(array_slice($allUA, 0, $num)); echo "-------------------", PHP_EOL; $os = statOS($allUA); echo PHP_EOL, "os count:", PHP_EOL; printCount($os); $browser = statBrowser($allUA); echo PHP_EOL, "browser count:", PHP_EOL; printCount($browser);
Posted on Sun, 01 Dec 2019 01:36:10 -0500 by bhoward3
Hot Tags
- Java — 7906
- Database — 3176
- Python — 3103
- Attribute — 2963
- Programming — 2938
- Javascript — 2788
- Spring — 2575
- xml — 2270
- Android — 2243
- Linux — 2204
- JSON — 2150
- less — 2137
- network — 2115
- github — 2063
- MySQL — 1760
- SQL — 1616
- PHP — 1559
- encoding — 1360
- Mobile — 1172
- Apache — 1137
How to Store Visitor Activity Log in the MySql Database Using PHP
In this article, we will learn about the website visitor activity tracking script. User activity on the online application / Website can be tracked using the Visitor Log. You’ll collect the visitor’s IP address, referrer, browser, and other information when they visit the website and store it in a database log.
The country, latitude, and longitude of the visitor can also be stored in the database for geolocation tracking. Along with the visitor’s information, the logging system frequently stores and tracks the website’s interior access information. The $_SERVER variable in PHP will be used to achieve the majority of the knowledge. To get the visitors’ geolocation data, you’ll use a third-party API.
Are you want to get implementation help, or modify or extend the functionality of this script?
A Tutorialswebsite Expert can do it for you.
Using PHP and MySQL, we’ll show you how to collect visitor information (IP, referrer, browser, geolocation, and so on) and store logs in a database. We’ll use PHP to log the visitor’s activity in the MySQL database.
Store Visitor Activity Log in the MySql Database
Step-1: Create Database Tablel
To store the user activity information, a table should be made in the database. The following SQL query creates a visitor_activity_logs table with some essential fields in the MySQL database.