visit.php

来自「一款可以和GOOGLE媲美的开源统计系统,运用AJAX.功能强大. 无色提示:」· PHP 代码 · 共 831 行 · 第 1/2 页

PHP
831
字号
<?php/** * Piwik - Open source web analytics *  * @link http://piwik.org * @license http://www.gnu.org/licenses/gpl-3.0.html Gpl v3 or later * @version $Id: Visit.php 575 2008-07-26 23:08:32Z matt $ *  * @package Piwik_Tracker */interface Piwik_Tracker_Visit_Interface {	function handle();	function setDb($db);}/** * Class used to handle a Visit. * A visit is either NEW or KNOWN. * - If a visit is NEW then we process the visitor information (settings, referers, etc.) and save * a new line in the log_visit table. * - If a visit is KNOWN then we update the visit row in the log_visit table, updating the number of pages * views, time spent, etc. *  * Whether a visit is NEW or KNOWN we also save the action in the DB.  * One request to the piwik.php script is associated to one action. *  * @package Piwik_Tracker */class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface{	protected $cookieLog = null;	protected $visitorInfo = array();	protected $userSettingsInformation = null;	protected $db = null;	protected $idsite;	function __construct()	{		$idsite = Piwik_Common::getRequestVar('idsite', 0, 'int');		if($idsite <= 0)		{			throw new Exception("The 'idsite' in the request is invalid.");		}				$this->idsite = $idsite;	}		public function setDb($db)	{		$this->db = $db;	}		/**	 * Returns the current date in the "Y-m-d" PHP format	 * @return string	 */	protected function getCurrentDate( $format = "Y-m-d")	{		return date($format, $this->getCurrentTimestamp() );	}		/**	 * Returns the current Timestamp	 * @return int	 */	protected function getCurrentTimestamp()	{		return time();	}		/**	 * Returns the date in the "Y-m-d H:i:s" PHP format	 * @return string	 */	protected function getDatetimeFromTimestamp($timestamp)	{		return date("Y-m-d H:i:s", $timestamp);	}	/**	 * Test if the current visitor is excluded from the statistics.	 * 	 * Plugins can for example exclude visitors based on the 	 * - IP	 * - If a given cookie is found	 * 	 * @return bool True if the visit must not be saved, false otherwise	 */	protected function isExcluded()	{		$excluded = 0;		Piwik_PostEvent('Tracker.Visit.isExcluded', $excluded);		if($excluded)		{			printDebug("Visitor excluded.");			return true;		}				return false;	}		/**	 * Returns the cookie name used for the Piwik Tracker cookie	 * @return string	 */	protected function getCookieName()	{		return Piwik_Tracker_Config::getInstance()->Tracker['cookie_name'] . $this->idsite;	}			/**	 * This methods tries to see if the visitor has visited the website before.	 * 	 * We have to split the visitor into one of the category 	 * - Known visitor	 * - New visitor	 * 	 * A known visitor is a visitor that has already visited the website in the current month.	 * We define a known visitor using the algorithm:	 * 	 * 1) Checking if a cookie contains	 * 		// a unique id for the visitor	 * 		- id_visitor 	 * 	 * 		// the timestamp of the last action in the most recent visit	 * 		- timestamp_last_action 	 *  	 *  	// the timestamp of the first action in the most recent visit	 * 		- timestamp_first_action	 * 	 * 		// the ID of the most recent visit (which could be in the past or the current visit)	 * 		- id_visit 	 * 	 * 		// the ID of the most recent action	 * 		- id_last_action	 * 	 * 2) If the visitor doesn't have a cookie, we try to look for a similar visitor configuration.	 * 	  We search for a visitor with the same plugins/OS/Browser/Resolution for today for this website.	 */	protected function recognizeTheVisitor()	{		$this->visitorKnown = false;				$this->cookieLog = new Piwik_Cookie( $this->getCookieName() );		/*		 * Case the visitor has the piwik cookie.		 * We make sure all the data that should saved in the cookie is available.		 */				if( false !== ($idVisitor = $this->cookieLog->get( Piwik_Tracker::COOKIE_INDEX_IDVISITOR )) )		{			$timestampLastAction = $this->cookieLog->get( Piwik_Tracker::COOKIE_INDEX_TIMESTAMP_LAST_ACTION );			$timestampFirstAction = $this->cookieLog->get( Piwik_Tracker::COOKIE_INDEX_TIMESTAMP_FIRST_ACTION );			$idVisit = $this->cookieLog->get( Piwik_Tracker::COOKIE_INDEX_ID_VISIT );			$idLastAction = $this->cookieLog->get( Piwik_Tracker::COOKIE_INDEX_ID_LAST_ACTION );						if(		$timestampLastAction !== false && is_numeric($timestampLastAction)				&& 	$timestampFirstAction !== false && is_numeric($timestampFirstAction)				&& 	$idVisit !== false && is_numeric($idVisit)				&& 	$idLastAction !== false && is_numeric($idLastAction)			)			{				$this->visitorInfo['visitor_idcookie'] = $idVisitor;				$this->visitorInfo['visit_last_action_time'] = $timestampLastAction;				$this->visitorInfo['visit_first_action_time'] = $timestampFirstAction;				$this->visitorInfo['idvisit'] = $idVisit;				$this->visitorInfo['visit_exit_idaction'] = $idLastAction;								$this->visitorKnown = true;																printDebug("The visitor is known because he has the piwik cookie (idcookie = {$this->visitorInfo['visitor_idcookie']}, idvisit = {$this->visitorInfo['idvisit']}, last action = ".date("r", $this->visitorInfo['visit_last_action_time']).") ");			}		}		/*		 * If the visitor doesn't have the piwik cookie, we look for a visitor that has exactly the same configuration		 * and that visited the website today.		 */		if( !$this->visitorKnown )		{			$userInfo = $this->getUserSettingsInformation();			$md5Config = $userInfo['config_md5config'];			$visitRow = $this->db->fetch( 										" SELECT  	visitor_idcookie, 													UNIX_TIMESTAMP(visit_last_action_time) as visit_last_action_time,													UNIX_TIMESTAMP(visit_first_action_time) as visit_first_action_time,													idvisit,													visit_exit_idaction 										FROM ".$this->db->prefixTable('log_visit').										" WHERE visit_server_date = ?											AND idsite = ?											AND config_md5config = ?										ORDER BY visit_last_action_time DESC										LIMIT 1",										array( $this->getCurrentDate(), $this->idsite, $md5Config));			if($visitRow 				&& count($visitRow) > 0)			{				$this->visitorInfo['visitor_idcookie'] = $visitRow['visitor_idcookie'];				$this->visitorInfo['visit_last_action_time'] = $visitRow['visit_last_action_time'];				$this->visitorInfo['visit_first_action_time'] = $visitRow['visit_first_action_time'];				$this->visitorInfo['idvisit'] = $visitRow['idvisit'];				$this->visitorInfo['visit_exit_idaction'] = $visitRow['visit_exit_idaction'];								$this->visitorKnown = true;								printDebug("The visitor is known because of his userSettings+IP (idcookie = {$visitRow['visitor_idcookie']}, idvisit = {$this->visitorInfo['idvisit']}, last action = ".date("r", $this->visitorInfo['visit_last_action_time']).") ");			}		}	}		/**	 * Gets the UserSettings information and returns them in an array of name => value	 * 	 * @return array	 */	protected function getUserSettingsInformation()	{		// we already called this method before, simply returns the result		if(is_array($this->userSettingsInformation))		{			return $this->userSettingsInformation;		}						$plugin_Flash 			= Piwik_Common::getRequestVar( 'fla', 0, 'int');		$plugin_Director 		= Piwik_Common::getRequestVar( 'dir', 0, 'int');		$plugin_Quicktime		= Piwik_Common::getRequestVar( 'qt', 0, 'int');		$plugin_RealPlayer 		= Piwik_Common::getRequestVar( 'realp', 0, 'int');		$plugin_Pdf 			= Piwik_Common::getRequestVar( 'pdf', 0, 'int');		$plugin_WindowsMedia 	= Piwik_Common::getRequestVar( 'wma', 0, 'int');		$plugin_Java 			= Piwik_Common::getRequestVar( 'java', 0, 'int');		$plugin_Cookie 			= Piwik_Common::getRequestVar( 'cookie', 0, 'int');				$userAgent		= Piwik_Common::sanitizeInputValues(@$_SERVER['HTTP_USER_AGENT']);		$aBrowserInfo	= Piwik_Common::getBrowserInfo($userAgent);		$browserName	= $aBrowserInfo['name'];		$browserVersion	= $aBrowserInfo['version'];				$os				= Piwik_Common::getOs($userAgent);				$resolution		= Piwik_Common::getRequestVar('res', 'unknown', 'string');		$ip				= Piwik_Common::getIp();		$ip 			= ip2long($ip);		$browserLang	= substr(Piwik_Common::getBrowserLanguage(), 0, 20);				$configurationHash = $this->getConfigHash( 												$os,												$browserName,												$browserVersion,												$resolution,												$plugin_Flash,												$plugin_Director,												$plugin_RealPlayer,												$plugin_Pdf,												$plugin_WindowsMedia,												$plugin_Java,												$plugin_Cookie,												$ip,												$browserLang);														$this->userSettingsInformation = array(			'config_md5config' => $configurationHash,			'config_os' 			=> $os,			'config_browser_name' 	=> $browserName,			'config_browser_version' => $browserVersion,			'config_resolution' 	=> $resolution,			'config_pdf' 			=> $plugin_Pdf,			'config_flash' 			=> $plugin_Flash,			'config_java' 			=> $plugin_Java,			'config_director' 		=> $plugin_Director,			'config_quicktime' 		=> $plugin_Quicktime,			'config_realplayer' 	=> $plugin_RealPlayer,			'config_windowsmedia' 	=> $plugin_WindowsMedia,			'config_cookie' 		=> $plugin_Cookie,			'location_ip' 			=> $ip,			'location_browser_lang' => $browserLang,					);				return $this->userSettingsInformation;	}		/**	 * Returns true if the last action was done during the last 30 minutes	 * @return bool	 */	protected function isLastActionInTheSameVisit()	{		return $this->visitorInfo['visit_last_action_time'] 					>= ($this->getCurrentTimestamp() - Piwik_Tracker_Config::getInstance()->Tracker['visit_standard_length']);	}	/**	 * Returns true if the recognizeTheVisitor() method did recognize the visitor	 */	protected function isVisitorKnown()	{		return $this->visitorKnown === true;	}		/**	 *	Main algorith to handle the visit. 	 *	 *  Once we have the visitor information, we have to define if the visit is a new or a known visit.	 * 	 * 1) When the last action was done more than 30min ago, 	 * 	  or if the visitor is new, then this is a new visit.	 *		 * 2) If the last action is less than 30min ago, then the same visit is going on. 	 *	Because the visit goes on, we can get the time spent during the last action.	 *	 * NB:	 *  - In the case of a new visit, then the time spent 	 *	during the last action of the previous visit is unknown. 	 * 	 *	- In the case of a new visit but with a known visitor, 	 *	we can set the 'returning visitor' flag.	 *	 * In all the cases we set a cookie to the visitor with the new information.	 */	public function handle()	{		if($this->isExcluded())		{			return;		}				$this->recognizeTheVisitor();		if( $this->isVisitorKnown() 			&& $this->isLastActionInTheSameVisit())		{			$this->handleKnownVisit();		}		else		{			$this->handleNewVisit();		}				// we update the cookie with the new visit information		$this->updateCookie();	}	/**	 * Update the cookie information.	 */	protected function updateCookie()	{		printDebug("We manage the cookie...");				// idcookie has been generated in handleNewVisit or we simply propagate the old value		$this->cookieLog->set( 	Piwik_Tracker::COOKIE_INDEX_IDVISITOR, 								$this->visitorInfo['visitor_idcookie'] );				// the last action timestamp is the current timestamp		$this->cookieLog->set( 	Piwik_Tracker::COOKIE_INDEX_TIMESTAMP_LAST_ACTION, 									$this->visitorInfo['visit_last_action_time'] );				// the first action timestamp is the timestamp of the first action of the current visit		$this->cookieLog->set( 	Piwik_Tracker::COOKIE_INDEX_TIMESTAMP_FIRST_ACTION, 									$this->visitorInfo['visit_first_action_time'] );				// the idvisit has been generated by mysql in handleNewVisit or simply propagated here		$this->cookieLog->set( 	Piwik_Tracker::COOKIE_INDEX_ID_VISIT, 									$this->visitorInfo['idvisit'] );				// the last action ID is the current exit idaction		$this->cookieLog->set( 	Piwik_Tracker::COOKIE_INDEX_ID_LAST_ACTION, 									$this->visitorInfo['visit_exit_idaction'] );										$this->cookieLog->save();	}			/**	 * In the case of a known visit, we have to do the following actions:	 * 	 * 1) Insert the new action	 * 	 * 2) Update the visit information	 */	protected function handleKnownVisit()	{		printDebug("Visit known.");						/**		 * Init the action		 */		$action = $this->getActionObject();		$actionId = $action->getActionId();		printDebug("idAction = $actionId");						$serverTime 	= $this->getCurrentTimestamp();		$datetimeServer = $this->getDatetimeFromTimestamp($serverTime);			$this->db->query("/* SHARDING_ID_SITE = ". $this->idsite ." */							UPDATE ". $this->db->prefixTable('log_visit')." 							SET visit_last_action_time = ?,								visit_exit_idaction = ?,								visit_total_actions = visit_total_actions + 1,								visit_total_time = UNIX_TIMESTAMP(visit_last_action_time) - UNIX_TIMESTAMP(visit_first_action_time)							WHERE idvisit = ?							LIMIT 1",							array( 	$datetimeServer,									$actionId,									$this->visitorInfo['idvisit'] )				);		/**		 * Save the action		 */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?