Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [skrypt][design] Statystyki internetowe
Forum PHP.pl > Inne > Oceny
toolmaniak
Witam. Chciałem oddać do ogólnej oceny mój projekt statystyk internetowych. Niestety jak narazie mogę jedynie przekazać do wglądu screenshoty, oraz część struktury bazy danych i kodu PHP. Projekt z założenia miał raportować w miarę jak to tylko możliwe, szczegółowe informacje o odwiedzającyh witrynę, w tym poza zwykłą geolokalizacją miał również pozwalać na rozpoznanie kim dokładnie jest przeglądający, w czym pomocne okazały się zapytania do serwerów WHOIS zarówno dla adresów IP jak i dla domen.

Adres do galerii statystyk:http://toolmaniak.dtfoto.net/index.php?pageid=4&lang=pl

Do najważniejszych zalet systemu należą więc:
  • zapisywanie podstawowych informacji o odwiedzającym
  • raportowanie jak użytkownik dotarł na naszą stronę ( skąd nastąpiło przekierowanie).
  • Jakiego otoczenia systemowego używa tzn. jakiej przeglądarki, jaki OS, jakia głębia kolorów, rozdzielczość ekranu,obsługa JAVY, jaki typ połączenia
  • informacje szczegółowe z zapytań whois min.: pula adresowa, nazwa sieciowa,opis właściciela adresu IP, adres, osoba odpowiedzialna, kraj , email, domena, adres DNS, właściciel domeny itp.
  • informacje o odwiedzanych lokalizacjach na witrynie z dokładną datą i czasem (możliwe jest pokazywanie pełnych URI lub ucięcie do podkatalogu w którym dana podstrona się znajduje, co pomoże przy analizach popularności różnych tematów naszego serwisu po nazwie folderu)
  • podział odwiedzających na nowych i powracającyh
  • rozróżnienie również oglądalności strony na wizyty i odsłony
  • mapka geolokalizacyjna z google maps, umożłiwiająca graficzne przedstawienie lokalizacji odwiedzającego (domyślnie kraj/państwo) ,ale jeśli to możliwe, również co do miasta i ulicy (w zależności od zapytań whois).
  • generator wykresów oparty o klasę jpgraph
  • wyszukiwarka według dowolnych danych, po nazwie, adresie itp.
  • narzędzia sieciowe takie jak whois (wyświetlający pełne rekordy z zapytań), ping, traceroute
  • export wyników do excela lub csv, teraz również w toku jest export do PDF.
Część struktury bazy statystyk:
  1. DROP TABLE IF EXISTS `ROOT`;
  2. CREATE TABLE `ROOT` (
  3. `ID` int(21) NOT NULL AUTO_INCREMENT,
  4. `IP_ADDR_32` varchar(16) NOT NULL DEFAULT '000000000000',
  5. `HOST_NAME` varchar(110) DEFAULT NULL,
  6. `WHOI_VERIFY` enum('Y','N') DEFAULT 'N',
  7. PRIMARY KEY (`ID`),
  8. UNIQUE KEY `ID` (`IP_ADDR_32`)
  9. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  10.  
  11. --
  12. -- Table structure for table `EXTENSION`
  13. --
  14.  
  15. DROP TABLE IF EXISTS `EXTENSION`;
  16. CREATE TABLE `EXTENSION` (
  17. `ID` int(30) NOT NULL AUTO_INCREMENT,
  18. `ID_IP_ADDR_32` int(21) DEFAULT '0',
  19. `VISIT_DATA` date DEFAULT '0000-00-00',
  20. `SYS_ENVIROMENT` varchar(255) DEFAULT NULL,
  21. `HTTP_REFFERER` varchar(255) DEFAULT NULL,
  22. `LOCATION` varchar(255) DEFAULT NULL,
  23. PRIMARY KEY (`ID`),
  24. UNIQUE KEY `ID` (`ID`)
  25. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  26.  
  27. --
  28. -- Table structure for table `ENVIRON`
  29. --
  30.  
  31. DROP TABLE IF EXISTS `ENVIRON`;
  32. CREATE TABLE `ENVIRON` (
  33. `VISIT_ID` int(30) NOT NULL DEFAULT '0',
  34. `BROWSER` varchar(50) DEFAULT NULL,
  35. `CODE_NAME` varchar(20) DEFAULT NULL,
  36. `OS_PLATFORM` varchar(30) DEFAULT NULL,
  37. `RES_WIDTH` int(5) DEFAULT NULL,
  38. `RES_HEIGHT` int(5) DEFAULT NULL,
  39. `DEPTH` int(3) DEFAULT NULL,
  40. `JAVA_ENABLED` enum('TAK','NIE') DEFAULT NULL,
  41. PRIMARY KEY (`VISIT_ID`),
  42. UNIQUE KEY `VISIT_ID` (`VISIT_ID`)
  43. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  44. /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;



Kod głównego modułu działającego w tle:
  1. <?
  2.  
  3.  
  4. (...)
  5. require_once();
  6.  
  7.  
  8.  
  9. $hours = date("H");
  10. $mins = date("i");
  11. $seconds = date("s");
  12. $hours = $hours*3600;
  13. $mins = $mins*60;
  14. $seconds = $seconds;
  15. $expire_zone = 86400 - $hours - $mins - $seconds;
  16.  
  17. $visited_count++;
  18. setcookie("visited_count",$visited_count,time()+$expire_zone);
  19. //error_reporting(0);
  20. //funkcja detekcji adresu IP
  21. function getClientIP()
  22. {
  23.  $ip = 0;
  24.  
  25.  if (!empty($_SERVER['HTTP_CLIENT_IP']))
  26.  $ip = $_SERVER['HTTP_CLIENT_IP'];
  27. //wykrywa również połączenia przez serwery PROXY
  28.  if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  29.  $ipList = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
  30.  if ($ip) {
  31. array_unshift($ipList, $ip);
  32. $ip = 0;
  33.  }
  34.  foreach ($ipList as $v);
  35.  if (!eregi("^(192.168|172.16|10|224|240|127|0).", $v))
  36. return $v;
  37.  
  38.  }
  39.  return $ip ? $ip : $_SERVER['REMOTE_ADDR'];
  40. }
  41. getClientIP();
  42. $ip= sprintf("%u",ip2long(getClientIP())); 
  43.  /* $ip = ip2long(getClientIP());
  44. $ip = sprintf("%u",$ip); */
  45.  
  46. mysql_connect($db_server,$stat_user,$password) or die (mysql_error());
  47. mysql_select_db('stat');
  48. //konwertuje IP do postaci czterooktetowej IPv4
  49. $ip_get_32=mysql_query("SELECT INET_NTOA('".$ip."')");
  50. $result_ip=mysql_fetch_row($ip_get_32);
  51. $target=$result_ip[0];
  52.  
  53. //Pobierz nazwe domeny z DNS
  54. $target_domainame = gethostbyaddr($target);
  55.  
  56. function reverse_strrchr ($haystack,$needle,$trail) {
  57. return strrpos($haystack,$needle) ? substr($haystack,0,strrpos($haystack,$needle)+$trail) : false;
  58. }
  59. $uri_mode = (reverse_strrchr($_SERVER['HTTP_REFERER'], "/", 1));
  60.  
  61. print htmlspecialchars($_GET['browser']);
  62. @mysql_query("INSERT INTO ROOT (IP_ADDR_32,HOST_NAME) values ('".$result_ip[0]."','".$target_domainame."')");
  63.  
  64. $table_root = mysql_query("SELECT ID FROM ROOT where IP_ADDR_32='".$result_ip[0]."'");
  65. $id_table_root = MYSQL_FETCH_ARRAY($table_root);
  66. print $visited_count;
  67. if ($visited_count == 1 ) {
  68.  
  69. mysql_query("SET AUTOCOMMIT=0");
  70. mysql_query("START TRANSACTION");
  71. mysql_query("SAVEPOINT OpenDB");
  72. $extension_q=mysql_query("INSERT INTO EXTENSION (ID_IP_ADDR_32,VISIT_DATA,SYS_ENVIROMENT,HTTP_REFFERER,LOCATION) values  ('".$id_table_root[0]."','".date('Y-m-d')."','".htmlspecialchars($_SERVER['HTTP_USER_AGENT'])."','".htmlspecialchars($_GET['referer'])."','".htmlspecialchars($_SERVER['HTTP_REFERER'])."')");
  73. if (!$extension_q) 
  74. {
  75. mysql_query("ROLLBACK TO SAVEPOINT OpenDB");
  76. }
  77. else if ($extension_q)
  78. {
  79. $environ_q=mysql_query("INSERT INTO ENVIRON (VISIT_ID,BROWSER,CODE_NAME,OS_PLATFORM,RES_WIDTH,RES_HEIGHT,DEPTH,JAVA_ENAB
    L
  80. D) values ('".mysql_insert_id()."' , '".htmlspecialchars($_GET['browser'])."','".htmlspecialchars($_GET['code_name'])."','".htmlspecialchars($_GET['os_platform'])."','".htmlspecialchars($_GET['res_width'])."','".htmlspecialchars($_GET['res_height'])."','".htmlspecialchars($_GET['depth'])."','".htmlspecialchars($_GET['java'])."')");
  81. if (!$environ_q) 
  82. {
  83. mysql_query("ROLLBACK TO SAVEPOINT OpenDB"); 
  84. }
  85. else if ($environ_q)
  86. {
  87. mysql_query("COMMIT");
  88. mysql_query("RELEASE OpenDB");
  89. mysql_query("SET AUTOCOMMIT=1");
  90. $visit_q=mysql_query("SELECT max(ENVIRON.VISIT_ID) FROM ROOT,EXTENSION,ENVIRON WHERE ENVIRON.VISIT_ID = EXTENSION.ID AND EXTE
    N
  91. ION.ID_IP_ADDR_32 = ROOT.ID AND ROOT.ID = ".$id_table_root[0]);
  92.  
  93. $visited_ident = MYSQL_FETCH_ARRAY($visit_q);
  94. $ident = $visited_ident[0];
  95.  
  96. setcookie("visited_id",$ident,time()+$expire_zone);
  97.  
  98. mysql_query("INSERT INTO URLS (VISIT_ID,VISIT_URL) VALUES (".$ident.",'".$uri_mode."')"); 
  99.  
  100. }
  101. }
  102. }
  103. mysql_query("INSERT INTO URLS (VISIT_ID,VISIT_URL) VALUES (".$visited_id.",'".$uri_mode."')");
  104.  
  105. ?>


Pobiera on dane z wejściowego skryptu JSCript znajdującego się w stopce każdego dokumentu który ma być raportowany po czym umieszcza takie informacje jak adres IP, nazwa DNS, użyta przeglądarka, system operacyjny,rozdzielczość, obsługa maszyny wirtualnej Javy, strona referująca i jeszcze pare innych w odpowiednich tabelach mysql. Po tym zależnie od ustawień w pliku konfiguracyjnym demona Crontab odpalany jest co jakiś czas (domyślnie co 15 minut) proces sprawdzania rekordów oznaczonych jako niezweryfikowane poprzez zapytania do serwerów WHOIS na podstawie fsockopen().
toolmaniak
Chciałem tylko dołączyć do oceny designu statystyk, ostatnio dodany nowy API wykresów oparty na Open Flash Chart. poniżej zamieszczam dwa screenshoty.




phpion
Wow, całość wygląda bardzo imponująco. Gdybyś tylko całość napisał obiektówką używając abstrakcji bazy danych byłby wypas. Ale tak czy srak naprawdę kapitalna robota, najszczersze gratulacje!
envp
Wygląda, wygląda - ale gdzie można "dotknąć" ? ocenianie samych obrazków i kawałku kodu, czy też struktury bazy danych - średnio...
toolmaniak
Wiem, wiem ocenianie czegoś czego nie można samemu przetestować nie jest cool. Niestety narazie projekt (jakkolwiek działający i to bez najmniejszych problemów) jest w fazie ciągłego dostrajania. Powstał on jako inicjatywa jednej z firm dla których pracuje, dlatego tymczasowo nie mam gdzie postawić jakiegoś ogólniedostępnego demo. Pozatym jeszcze trzeba parę rzeczy załatać, może nie tak poważnych ale zawsze coś się znajdzie. Kiedyś napewno przyjdzie pora na zaprezentowanie go ogółowi, i napewno nie omieszkam rozpocząć od tego forum smile.gif. Być może brakuje tu rzeczywiście obiektowości, bo poza klasą do wykresów wszystko idzie strukturalnie, ale jakoś narazie tak wyszło, być może w przyszłości to poprawie. W każdym razie dzięki wielkie za odzew na ten projekt. Wkrótce zamierzam też oddać do oceny mój CRM. Pozdrówka
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.