122 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Created by PhpStorm.
 | |
|  * User: Mike
 | |
|  * Date: 20.07.14
 | |
|  * Time: 18:41
 | |
|  */
 | |
| 
 | |
| class CHitCounter extends CApplicationComponent {
 | |
| 
 | |
| 	/* @var string $table_stats */
 | |
| 	public $table_stats;
 | |
| 	/* @var string $table_today */
 | |
| 	public $table_today;
 | |
| 
 | |
| 	/* @var bool $updated */
 | |
| 	private $updated = false;
 | |
| 	/**
 | |
| 	 * Call this function on every view - it increments the hit counter if this is a new unique view
 | |
| 	 *
 | |
| 	 * @return bool true if this is a unique view
 | |
| 	 */
 | |
| 	public function increment()
 | |
| 	{
 | |
| 		if ($this->isBot()) // Do not track bots
 | |
| 			return;
 | |
| 
 | |
| 		$this->tryUpdateStats();
 | |
| 
 | |
| 		$connection=Yii::app()->db;
 | |
| 
 | |
| 		$date_fmt = (new DateTime())->format('Y-m-d');
 | |
| 		$ipaddr = $_SERVER['REMOTE_ADDR'];
 | |
| 
 | |
| 		$unique = $connection->createCommand("SELECT COUNT(*) FROM $this->table_today WHERE ipaddress = '$ipaddr'")->queryScalar() == 0;
 | |
| 
 | |
| 		if ($unique)
 | |
| 		{
 | |
| 			$connection->createCommand("INSERT INTO $this->table_today (date, ipaddress) VALUES ('$date_fmt', '$ipaddr');")->execute();
 | |
| 		}
 | |
| 
 | |
| 		return $unique;
 | |
| 	}
 | |
| 
 | |
| 	public function getTotalCount()
 | |
| 	{
 | |
| 		$count = Yii::app()->db->createCommand("SELECT SUM(count) FROM $this->table_stats")->queryScalar();
 | |
| 
 | |
| 		$count = (($count) ? $count : 0) + $this->getTodayCount();
 | |
| 
 | |
| 		return $count;
 | |
| 	}
 | |
| 
 | |
| 	public function getTodayCount()
 | |
| 	{
 | |
| 		$this->tryUpdateStats();
 | |
| 
 | |
| 		return Yii::app()->db->createCommand("SELECT COUNT(*) FROM $this->table_today")->queryScalar();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param DateTime $day
 | |
| 	 *
 | |
| 	 * @return int
 | |
| 	 */
 | |
| 	public function getCountForDay($day)
 | |
| 	{
 | |
| 		if ((new DateTime())->format('Y-m-d') == $day->format('Y-m-d'))
 | |
| 			return $this->getTodayCount();
 | |
| 
 | |
| 		$fmt = $day->format('Y-m-d');
 | |
| 
 | |
| 		$count =  Yii::app()->db->createCommand("SELECT count FROM ms4_hc_stats WHERE date = '$fmt'")->queryScalar();
 | |
| 
 | |
| 		return ($count) ? $count : 0;
 | |
| 	}
 | |
| 
 | |
| 	//#############################################################
 | |
| 
 | |
| 	/**
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	private function isBot()
 | |
| 	{
 | |
| 		return (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/bot|crawl|slurp|spider/i', $_SERVER['HTTP_USER_AGENT']));
 | |
| 	}
 | |
| 
 | |
| 	private function tryUpdateStats()
 | |
| 	{
 | |
| 		if ($this->updated)
 | |
| 			return; // Only update once per instance
 | |
| 		$this->updated = true;
 | |
| 
 | |
| 
 | |
| 		$connection=Yii::app()->db;
 | |
| 
 | |
| 		$row = $connection->createCommand("SELECT * FROM $this->table_today")->queryRow();
 | |
| 
 | |
| 		if (! $row)
 | |
| 			return false; // nothing to update
 | |
| 
 | |
| 		$last_date = new DateTime($row['date']);
 | |
| 
 | |
| 		if ($last_date->format('Y-m-d') != (new DateTime())->format('Y-m-d'))
 | |
| 		{
 | |
| 			// Get last count
 | |
| 			$lastday_count = $connection->createCommand("SELECT COUNT(*) FROM $this->table_today")->queryScalar();
 | |
| 
 | |
| 			// Insert into stats
 | |
| 			$last_date_fmt = $last_date->format('Y-m-d');
 | |
| 			$connection->createCommand("INSERT INTO $this->table_stats (date, count) VALUES ('$last_date_fmt', $lastday_count)")->execute();
 | |
| 
 | |
| 			// Delete today table
 | |
| 			$connection->createCommand("DELETE FROM $this->table_today")->execute();
 | |
| 			return true;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 	}
 | |
| } 
 |