Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP Kävijälaskuri

virtualtour [12.05.2012 12:36:53]

#

Missä vika kun ilmoittaa virhe koodin?
Warning: fread() [function.fread]: Length parameter must be greater than 0 in /home/kaupu399/public_html/kavijat/laskuri.php on line 119
________________________________

<?php

	#################################################
	# 									                                                #
	# 				MVnetin kävijälaskuri  						     #
	# 				http://www.mvnet.fi	 					     #
	# 				Versio: 2006-08-30		                                                #
	# 									                                                #
	#################################################


	/* Määritellään aika minuutteina, jonka jälkeen "estetyt IP-osoitteet" -tiedosto nollataan.
	Vakiona arvo on yksi tunti eli 60 minuuttia. Jos siis saman IP-osoitteen omaava kävijä tulee uudestaan
	siville, ei häntä noteerata uudeksi kävijäksi, koska hänen IP-osoitteensa on "estetyt IP-osoitteet" -tiedostossas.
	Jos hän tulee uudestaan tunti sen jälkeen kun "estetyt IP-osoitteet" -tiedosto on viimeksi nollattu,
	noteerataan hänet uudeksi kävijäksi ja samalla "estetyt IP-osoitteet"-tiedosto nollataan.*/

	$vaihtoMinuutteina = 60;


	/* Määritellään se tiedostokoko kilotavuina, jolloin halutaan kavijatiedot.php-tiedoston nollaantuvan.
	Jossain vaiheessa tämän tiedoston koko kasvaa niin suureksi, että se ylittää alla olevan rajan (oletus 500),
	jolloin tiedosto automaattisesti tyhjennetään. */

	$kavijatiedotNollaus = 500;

	/* Määritellään luettelo taulukkona, johon luetteloidaan ne host-osoitteiden osat, joita ei lasketa uusiksi kävijöiksi.
	Jos kävijän host-osoitteessa on taulukossa mainittu tekstinpätkä, ei sitä lasketa uudeksi kävijäksi.
	Tämä taulukko on tarkoitettu siihen, että netin hakukoneet kuten Google eivät kasvattaisi virheellisesti kävijämääriä.
	Voit estää hakukoneen kasvattamasta kävijämäärää lisäämällä osan sen host-osoitteesta tähän listaan. Host-osoitteen osan pitää olla
	sellainen, että hakubotti tunnistetaan siitä aina. Esim. Googlen hakubotin host-osoite voi olla esim. crawl-66-249-65-205.googlebot.com,
	mutta tätä koko host-osoitetta ei laiteta listaan, koska tämä yksilöi vain yhden Googlen hakubotin (ja näitä Googlella on useita).
	Hakubotin host-osoitteen näkee esim. kävijätiedot-luettelosta etsimällä sanoja: bot, search, crawl. */

	$eiLasketa = array("googlebot.com", "msnbot.msn.com", "inktomisearch.com");


	/* Funktio, joka tarkistaa, onko parametrina annettu host-osoite hakurobotin osoite, jotka on määritelty
	yllä esitetyssä taulukossa, joka annetaan funktion toisena parametrina. */

	function onHakurobotti($verrattavaHost, $array) {

		$onBotti = false;

		for ($i=0; $i<count($array); $i++) {
			if (eregi($array[$i], $verrattavaHost)) {
				$onBotti = true;
				break;
			}
		}

		return $onBotti;

	}


	/* Funktio, joka lukee parametrina annetun tiedoston sisällön ja palauttaa sen. */

	function lueSisalto ($tiedosto)
	{
		return file_get_contents($tiedosto);
	}


	/* Funktio, joka lisää parametrina annettun tiedoston loppuun parametrina annetun lisättävän sisällön. */

	function lisaaTiedostonLoppuun ($tiedosto, $lisattava)
	{
		ignore_user_abort(true);

		$fd = fopen ($tiedosto, "a");

		/* Tiedostoon voi kirjoittaa vain, jos sen saa lukittua. Näin vältytään (toivottavasti) virheistä,
		joita tulisi, jos useampi kuin yksi yrittäisi kirjoittaa tiedostoon samaan aikaan. */

		if (flock($fd, LOCK_EX)) {
			fwrite($fd, $lisattava);
			flock($fd, LOCK_UN);
		}

		fclose($fd);

		ignore_user_abort(false);
	}


	/* Funktio, joka ylikirjoittaa parametrina annetun tiedoston parametrina annetulla kirjoitettavalla sisällöllä. */

	function ylikirjoitaSisalto ($tiedosto, $kirjoitettava)
	{
		ignore_user_abort(true);

		$fd = fopen ($tiedosto, "w");
		fwrite($fd, $kirjoitettava);
		fclose($fd);

		ignore_user_abort(false);
	}


	/* Funktio, joka kasvattaa parametrina annetun tiedoston sisältöä yhdellä. Eli funktio ensin lukee tiedoston sisällön
	ja sitten lisää sisältöön 1:n ja ylikirjoittaa tiedoston sisällön tällä uudella arvolla. Jos parametrina annettua tiedostoa
	ei ole olemassa, luodaan se ja chmodataan muotoon 766.*/

	function kasvataYhdella ($tiedosto)
	{

		ignore_user_abort(true);

		if (file_exists($tiedosto))
		{

			$fd = fopen ($tiedosto, "r+");

			/* Tiedostoon voi kirjoittaa vain, jos sen saa lukittua. Näin vältytään (toivottavasti) virheistä,
			joita tulisi, jos useampi kuin yksi yrittäisi kirjoittaa tiedostoon samaan aikaan. */

			if (flock($fd, LOCK_EX)) {
				$aiempiArvo = fread ($fd, filesize ($tiedosto));  // Luetaan aiempi arvo
				$aiempiArvo++;   // Kasvatetaan aiempaa arvoa yhdellä
				fseek($fd, 0);   // Laitetaan pointteri tiedoston alkuun ftruncatea varten
				ftruncate($fd, 0);   // Tyhjennetään tiedosto
				fwrite($fd, $aiempiArvo);   // Kirjoitetaan uusi arvo (eli aiempiArvo + 1)
				flock($fd, LOCK_UN);
			}

			fclose($fd);

		} else {

			$fd = fopen ($tiedosto, "w");
			chmod ($tiedosto, 0766);  // Chmodataan tiedosto muotoon 766, jotta siihen voisi kirjoittaa
			fwrite($fd, "1");
			fclose($fd);

		}

		ignore_user_abort(false);

	}


	/* Tallennetaan muuttujiin nykyinen päivämäärä ja kellonaika, kävijän IP-osoite, IP-osoitetta vastaava host,
	kävijän selain/käyttöjärjestelmä sekä osoite, jota kautta kävijä tuli sivuille (referer) ja haettu URL (eli mille sivulle kävijä tuli). */

	$aikaLeima = date('d.m.Y H:i:s');
	$ipOsoite = $_SERVER['REMOTE_ADDR'];
	$host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
	$selain = $_SERVER['HTTP_USER_AGENT'];
	$referer = $_SERVER['HTTP_REFERER'];
	$requestURL = $_SERVER['REQUEST_URI'];


	/* Kasvatetaan latauslaskuria yhdellä aina kun sivu ladataan  */
	$latausMaaratFile = $kavijatURL."lataukset.txt";   // Tähän tallennetaan lataukset yhteensä
	kasvataYhdella ($latausMaaratFile);


	/* Katsotaan, onko referer-osoite, josta kävijä tuli sivulle saman sivuston sivuja.
	Jos referer-sivu on tämän sivuston sivuja, ei kävijä tietenkään voi olla uusi kävijä,
	koska hän on klikannut linkkiä tältä sivustolta. Kävijää ei siis noteerata uudeksi
	kävijäksi, jos referer-osoite kuuluu samaan sivustoon.
	kotisivunOsoite-muuttuja määritellään "Jokaisen sivun alkuun"-koodissa.
	Jos kyseessä on hakurobotti, joka tunnistetaan sivun alussa määritellystä host-luettelosta,
	ei hakurobotin käyntiä noteerata.*/

	if (!eregi($kotisivunOsoite, $referer) && !onHakurobotti($host, $eiLasketa)) {


		/* Määritellään tiedostoja, joihin tallennetaan tietoja kävijöistä. Tiedostojen osoitteet ovat suhteellisia osoitteita.
		Osoitteiden edessä oleva kavijatURL-muuttuja saadaan "Jokaisen sivun alkuun" -koodista. */

		$ipEstotOsoitteetFile = $kavijatURL."ipEsto/ipesteet.txt";   // Estetyt IP-osoitteet-tiedosto
		$ipEstotAikaFile = $kavijatURL."ipEsto/tunnit.txt";   // Estetyt IP-osoitteet-tiedoston viimeisen nollauksen kellonaika minuutteina
		$ipEstotPaivaFile = $kavijatURL."ipEsto/paivat.txt";    // Estetyt IP-osoitteet-tiedoston viimeisen nollauksen päivän numero
		$kavijaMaaratFile = $kavijatURL."kavijat.txt";   // Tähän tallennetaan kävijämäärä yhteensä
		$kavijatiedotFile = $kavijatURL."kavijatiedot.php";   // Tähän tallennetaan tietoja kävijöistä (kellonaika, IP-osoite, referer ...)

		/* Määritellään tiedostot, joihin tallennetaan päivä, viikko ja kuukausi -kohtaiset kävijämäärät. */
		setlocale(LC_TIME, "fi_FI");
		$paivaFile = $kavijatURL."paivat/".strftime("%Y-%m-%d").".txt";   // Päiväkohtaiset kävijämäärät
		$viikkoFile = $kavijatURL."viikot/".strftime("%G-vko-%V").".txt";   // Viikkokohtaiset kävijämäärät (vko 1-53)
		$kuukausiFile = $kavijatURL."kuukaudet/".strftime("%Y#%m").".txt";     // Kuukausikohtaiest kävijämäärät

		/* Määritellään tiedostot, joihin tallennetaan kävijämäärät tunneittain ja viikonpäivittäin. */
		$tuntiFile = $kavijatURL."tunnit/".strftime("%H").".txt";  // Kävijämäärät tuntia kohden (00-23)
		$viikonpaivaFile = $kavijatURL."viikonpaivat/".date('D').".txt";  // Kävijämäärät viikonpäiviä kohden (Mon - Sun)


		/* Tallennetaan muuttujiin tämän päivän päiväyksen päivän numero ja kellonajan tunnit sekä minuutit. */
		$tamaPaiva = getdate();
		$paivaNyt = $tamaPaiva['yday'];  // Vuoden päivän numero nyt (1-366)
		$tunnitNyt = $tamaPaiva['hours'];  // Kellonajan tunnit nyt
		$minuutitNyt = $tamaPaiva['minutes'];  // Kellonajan minuutit nyt

		/* Luetaan ne estetyt IP-osoitteet, joiden käyntiä ei lasketa uudeksi kävijäksi. */
		$estetytIpOsoitteet = lueSisalto ($ipEstotOsoitteetFile);

		/* Luetaan se kellonaika minuutteina ja päivän numero, jolloin estetyt IP-osoitteet -tiedosto viimeksi nollattiin.  */
		$estoAikaMinuutteina = lueSisalto ($ipEstotAikaFile);
		$estoPaiva = lueSisalto ($ipEstotPaivaFile);


		/* Lasketaan erotus minuuteina: (nykyinen kellonaika) - (estetyt IP-osoitteet -tiedoston nollauksen kellonaika)  */
		$aikaErotus = 60*$tunnitNyt+$minuutitNyt-$estoAikaMinuutteina;

		/* Jos äsken laskettu erotus on suurempi tai yhtäsuuri kuin alussa määritelty vaihtoMinuutteina-muuttuja (oletus 60 minuuttia) tai
		jos nykyinen päivän numero on eri kuin estetyt IP-osoitteet -tiedoston nollauksen päivän numero, nollataan estetyt IP-osoitteet -tiedosto. */

		if ($aikaErotus >= $vaihtoMinuutteina || $estoPaiva != $paivaNyt)
		{

			/* Kirjoitetaan uudet estetyt IP-osoitteet -tiedoston nollausajat  */
			ylikirjoitaSisalto ($ipEstotAikaFile, 60*$tunnitNyt+$minuutitNyt);
			ylikirjoitaSisalto ($ipEstotPaivaFile, $paivaNyt);

			/* Nollataan estetyt IP-osoitteet -tiedosto. */
			ylikirjoitaSisalto ($ipEstotOsoitteetFile, "");
			$estetytIpOsoitteet = "";

		}


		/* Katsotaan, onko kävijän IP-osoite jo estettyjen IP-osoitteiden listassa. Jos ei ole, tulkitaan kävijä uudeksi kävijäksi
		ja lisätään yksi kävijä lisää laskureihin. Jos IP-osoite on jo estettyjen IP-osoitteiden listassa, ei kirjoiteta kävijälaskuriin uutta kävijää. */

		if (!ereg($ipOsoite, $estetytIpOsoitteet))
		{

			/* Lisätään kävijän IP-osoite estetyt IP-osoitteet -tiedostoon. */
			lisaaTiedostonLoppuun ($ipEstotOsoitteetFile, $ipOsoite);

			/* Kasvatetaan kävijämäärien laskureita. */
			kasvataYhdella ($kavijaMaaratFile);  // Kaikki kävijät yhteensä
			kasvataYhdella ($paivaFile);  // Päivämääräkohtaiset kävijämäärät
			kasvataYhdella ($viikkoFile);  // Viikkokohtaiset kävijämäärät
			kasvataYhdella ($kuukausiFile);  // Kuukausikohtaiset kävijämäärät
			kasvataYhdella ($tuntiFile);  // Käivjämäärät tunneittain
			kasvataYhdella ($viikonpaivaFile);  // Kävijämäärät viikonpäivittäin


			/* Kirjoitetaan tiedot kävijästä (kellonaika, IP-osoite, referer, selain/käyttöjärjestelmä ...).  */

			$kavijatiedotKoko = filesize ($kavijatiedotFile) / 1024;  // Kävijätiedot-tiedoston koko kilotavuina

			if ($referer == "")
				$referer = "suora";   // Jos kävijä on tullut suoraan sivuille, on referer-osoite "suora".

			/* Kävijän tiedot kirjoietaan tiedostoon html-taulukon soluina.  */
			$kirjoitaTiedot = "
			<tr>
			<td>$aikaLeima</td>
			<td>$ipOsoite -- $host</td>
			<td>$referer</td>
			<td>$requestURL</td>
			<td>$selain</td>
			</tr>
			";

			/* Jos kävijätiedot-sivu on kasvanut liian suureksi, nollataan se ja lisätään tiedoston
			alkuun peruskoodi, joka sisältää salasanakyselyn */

			$peruskoodi = "
			<?php
			include(\"peruskoodi.php\");
			?>";


			/* Katsotaan, onko kavijatiedot.php -sivun tiedostokoko saavuttanut sen nollausrajan.
			Jos tiedostokoko on suurempi tai yhtäsuuri kuin alussa määritelty nollausraja, tyhjennetään sivu ennen
			uuden kävijän tietojen lisäystä. Muutoin lisätään vain tiedot sivun loppuun muiden tietojen perään.*/

			if ($kavijatiedotKoko >= $kavijatiedotNollaus)
				ylikirjoitaSisalto ($kavijatiedotFile, $peruskoodi.$kirjoitaTiedot);
			else
				lisaaTiedostonLoppuun ($kavijatiedotFile, $kirjoitaTiedot);


		}  // Uuden kävijän tietojen ja laskurien kasvattamisen if-lauseen loppu


		clearstatcache ();

	}

?>

________________________________

Mod. korjasi kooditagit!

ErroR++ [12.05.2012 12:44:34]

#

Laittaisitko viestiisi kooditagit? Silloin olisi paljon helpompi lukea koodia.

dartvaneri [12.05.2012 13:08:04]

#

Ja olis järkevämpää heittää se sinne minne kuuluukin,Nettisivut ja -ohjelmointi

Macro [12.05.2012 13:24:22]

#

Kuten virheilmoituksessa lukee, freadin toisen parametrin pitää olla suurempi kuin nolla. Katso koodisi riviä 119.

Kannattais varmaan muuten harkita jotain muuta kuin tota...

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta