Wieviele sind online? [in php]

Hi,

ich suche nach einem php-script, welches mir anzeigen kann, wieviele User gerade auf meiner Seite surfen. Also genauso so etwas, wie auf der Startseite dieses Boards, deswegen denke ich auch, dass mir hier bestimmt jemand weiterhelfen kann ;)
Funktioniert das mit "SessionIDs"?

Gruß Thomas.
 
Manual zum script

PHP:
<?
/*
************************************************************************
* ? Sloppycode.net All rights reserved.
*
* This is a standard copyright header for all source code appearing
* at sloppycode.net. This application/class/script may be redistributed,
* as long as the above copyright remains intact. 
* Comments to [EMAIL]sloppycode@sloppycode.net[/EMAIL]
************************************************************************
*/

/*
* @title OnlineUsers Class, incorporating DataProducer class
* @author C.Small
* @version 2.1 - Public property for frequency of row deletion
* @version 2.0 - Database optimisation - change in table structure
* @version 1.0 - From an original written by Genesis <freedomfighter2015@home.com>
*/
class DataProducer
{
	
		function doDataProducer($startTag,$endTag,$data,$contents)
		{
			return $this->privateDataProducer($startTag,$endTag,$data,$contents);
		}
		function doSingleDataProducer($data,$contents)
		{
			return $this->privateSingleDataProducer($data,$contents);
		}
		function openTemplate($filename)
		{
			return $this->privateopenTemplate($filename);
		}

		function privateDataProducer($startTag,$endTag,$data,$contents)
		{
				// Get start and end points
				$start = strpos($contents,$startTag);
				$end   = strpos($contents,$endTag,$startTag);
				
				// Retrieve everything before start tag
				$prefix = substr($contents,0,$start);
				$prefix = rtrim($prefix);
				
				// Retrieve everything after end tag. Make it starts at the end of end-tag
				$suffix = substr($contents,$end + strlen($endTag),strlen($contents) - ($end + strlen($endTag)));
				$suffix = ltrim($suffix);
				
				// Retrieve data template. make sure it starts at the end of the start-tag.
				$dataTemplate = substr($contents,$start + strlen($startTag),$end - ($start + strlen($startTag)));
				
				// New method implemented here
				for ($i=0; $i <= sizeof($data) -1;$i++)
				{
					$tempReplace = $dataTemplate;
					$tempReplace = rtrim($tempReplace);
					
					$keys = array_keys($data[$i]);
					foreach($keys as $keyname)
					{
						if (!empty($data[$i][$keyname]))
						{
							$tempReplace = str_replace(\"<\".$keyname.\">\",$data[$i][$keyname],$tempReplace);
						} else{
							$tempReplace = str_replace(\"<\".$keyname.\">\",\"\",$tempReplace);
						}
					}
					$build .= $tempReplace;
				}
				
				return $prefix . $build . $suffix;
		}
		/**
		 *
		 */
		function privateSingleDataProducer($data,$contents)
		{
			$result = $contents;
			foreach ($data as $tagname => $value){
				$result = str_replace(\"<\".$tagname.\">\",$value,$result);
			}
			return $result;
		}
		/**
		 *
		 */
		function privateOpenTemplate($filename)
		{		
				$fHnd = @fopen($filename,\"r\") or die(\"<br><b>Unable to open template: \".$filename.\"</b>\");
				$contents = @fread($fHnd,filesize($filename)) or die(\"<br><b>Unable to open template: \".$filename.\"</b>\");
				fclose($fHnd);
				
				return $contents;
		}
}

Class OnlineUsers Extends DataProducer
{
	// Public
	var $host;
	var $username;
	var $password;
	var $dbname;
	var $tablename;
	var $timeout;
	var $update_frequency = 5;
	
	// Private
	var $conn;
	var $db;
	var $totalusers;
	
	function dbconnect()
	{
		$this->conn   = mysql_connect($this->host,$this->username,$this->password);
	}
	
	function setup($createdb)
	{
		// Create database if specified
		if ($createdb)
		{
			$SQL    = \"CREATE DATABASE IF NOT EXISTS \".$this->dbname;
			$result = mysql_query($SQL);
		}
		
		// Connect to specified db + drop table if it exists
		$this->db = mysql_select_db($this->dbname,$this->conn);
		$SQL    = \"DROP TABLE IF EXISTS \".$this->tablename;
		$result = mysql_query($SQL);
		
		// Create table with tablename
		$SQL    = \"CREATE TABLE \".$this->tablename.\" (
						  ip varchar(15) NOT NULL DEFAULT '' ,
						  time int(11) ,
						  PRIMARY KEY (ip),
						  UNIQUE id (ip),
						  INDEX id_2 (ip)
						);\";
		$result = mysql_query($SQL);
	}
	
	function updateAddUser()
	{
		global $HTTP_COOKIE_VARS;
		
		$this->db = mysql_select_db($this->dbname,$this->conn);
		
		$current_seconds = date(U);
		$deadline_seconds = $current_seconds - ($this->timeout * 60);
		$timeout_seconds = $this->timeout * 60;
		
		// Delete users that aren't connected anymore, according to $timeout;
		// (v2) No need to do it everytime - reduces load on heavily hit servers
		// this does it every 1 in 10 times
		mt_srand((double)microtime() * 1000000);
    	if (mt_rand(0, $this->update_frequency) == 1)
		{
			$SQL = \"DELETE FROM \".$this->tablename.\" WHERE time between 0 AND \".$deadline_seconds;
			$result = mysql_query($SQL);
		}
		
		$user_ip = getenv(\"REMOTE_ADDR\");
		
		$SQL = \"REPLACE INTO \".$this->tablename.\" (ip,time) VALUES ('\".$user_ip.\"','\".$current_seconds.\"')\";
		$result = mysql_query($SQL);
	}

	function showFullInfo($lookuphosts,$contents)
	{
		$this->db = mysql_select_db($this->dbname,$this->conn);
		$current_seconds = date(U);
		
		$this->getUsersOnline();
		$tags['totalusers']      = $this->totalusers;
		$tags['timeout_seconds'] = $this->timeout * 60;
		$tags['timeout_minutes'] = $this->timeout;
		$contents = $this->doSingleDataProducer($tags,$contents);
		unset($tags);
		
		$SQL = \"SELECT ip,time FROM \".$this->tablename;
		$result = mysql_query($SQL);
		while ($RS = mysql_fetch_array($result))
		{
			// Check it's not immediate
			if (($current_seconds - $RS[1]) <1)
			{
				$tags['seconds_ago'] = \" 0\";
			} else{
				$tags['seconds_ago'] = $current_seconds - $RS[1];
			}
			
			$tags['ipaddress']   = $RS[0];
			
			// Lookup IP host name if specified
			if ($lookuphosts)
			{
				$tags['host'] = gethostbyaddr($RS[0]);
			}
			$rows[] = $tags;
			unset($tags);
		}
		$contents = $this->doDataProducer(\"<user_details>\",\"</user_details>\",$rows,$contents);
		return $contents;
	}
	
	function getUsersOnline()
	{
		$this->db = mysql_select_db($this->dbname,$this->conn);
		
		// Get number of users online
		$SQL = \"SELECT count(ip) FROM \".$this->tablename;
		$result = mysql_query($SQL);
		$RS = mysql_fetch_row($result);
		$this->totalusers = $RS[0];
		return $RS[0];
	}
}
?>
 
wollte gerad nen Link posten den ich Sparx in IRC gesagt hab... 8)
 
Zurück
Oben