Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: "Ajastin" PHP:llä. Miten?

Sivun loppuun

odys [09.11.2003 23:09:55]

#

Tämä yksinkertainen vinkki näyttää miten PHP:llä toteutetaan ajastin. Ihan kätevä esim jos haluat 24h ajalta sivulataukset niin voit soveltamalla saada sen helposti aikaan.

<?php

	//==================================================================
	// "Ajastin" PHP:llä
	//
	// Tehnyt: odys
	// Päiväys: 09.11.2003
	//
	// Varsinkin aloittelijoille on vaikeaa tajuta PHP:n perimmäinen
	// tarkoitus ja toiminta. En nyt ala selittelemään pahemmin,
	// mutta jos kerran PHP ajetaan vain silloin kun käyttäjä lähet-
	// tää pyynnön palvelimelle eli lataa sivun selaimeensa, niin
	// miten siinä muka voi "ajastaa" jos latauskertojen välissä voi
	// olla vaikka teoriassa vuosia. :)
	//
	// Ratkaisu on erittäin yksinkertainen, vaikkakin aloittelijoille
	// todella vaikea ymmärtää. Joka sivunlatauksella katsomme mikä
	// on tämänhetkinen aika ja vertaamme sitä tallentamaamme aikaan
	// edelliseltä sivulataukselta. Jos nykyinen aika on suurempi
	// mitä tallennettu aika, on aika kulunut umpeen.
	//
	// time() - palauttaa ajan sekunteina, mitä on kulunut
	//          01.01.1970 00:00:00 (GMT) lähtien.
	//
	// Muista luoda ajastin.txt ja chmodata se ainakin 644
	//==================================================================

	function Ajastin ($timeout = 300) // $timeout on umpeutumisaika sekunteina (Nyt 5min)
	{
		// Haetaan aika, jolloin aika umpeutuu
		$iTime = unserialize(implode("", file("ajastin.txt")));
		// Jos aikaa ei ole vielä säädetty...
		if (trim($iTime) == "")
		{
			// ...säädetään aika (sekunteina), jolloin aika umpeutuu
			$iTime = time() + $timeout;
			// Avataan ajastin.txt kirjoitusta varten ja tyhjennetään se
			$hFile = fopen("ajastin.txt", "wb");
			// Lukitaan ajastin.txt, jottei tiedostoon kirjoiteta täysin samaan aikaan, mikä voi aiheuttaa tiedoston tyhjentymisen
			flock ($hFile, 2);
			// Kirjoitetaan $iTime bittivirtana (Säilyttää muuttujan tyypin ja se on helppo lukea tiedostosta) ajastin.txt:hen
			fputs ($hFile, serialize($iTime));
			// Avataan lukko
			flock ($hFile, 3);
			// Suljetaan tiedosto
			fclose ($hFile);
			// Palautetaan tilanne
			return "Tämä oli skriptin ensimmäinen lataus. Umpeutumisika on asetetu {$timeout}s päähän tästä.";
		}
		else
		{
			switch ($iTime)
			{
				// Jos $iTime on vielä suurempi kuin time() tarkoittaa se sitä että umpeutumisaikaan on vielä jokunen sekunti aikaa.
				case $iTime > time():
					return "Umpeutumisaikaan on jäljellä vielä " . ($iTime - time()) . "s.";
				break;
				// Jos $iTime on pienempi tai yhtä suuri kuin time() on aika umpeutunut
				case $iTime <= time():
					$iNewTime = time() + $timeout;
					$hFile = fopen("ajastin.txt", "wb");
					flock ($hFile, 2);
					fputs ($hFile, serialize($iNewTime));
					flock ($hFile, 3);
					fclose ($hFile);
					return "Aika oli umpeutunut " . (time() - $iTime) . "s sitten. Umpeutumisaika asetettiin uudestaan {$timeout}s päähän tästä.";
				break;
			}
		}
	}

	// Ajetaan joka sivunlataus ja samalla tulostetaan ajastimen tilanne
	echo Ajastin();

?>

Antti Laaksonen [10.11.2003 08:35:29]

#

Hyväntuntuista koodia

Tumpi [10.11.2003 17:57:20]

#

Pisti silmään toi että välillä käytät funktio() ja välillä taas funktio ().

odys [10.11.2003 18:04:02]

#

Käytän aina funktio () jos se on rivin ainoa ja ensimmäinen suoritettava funktio. En tiedä mistä tulee :DD

Jos tarkkailet koodia niin:
$muuttuja = time();
mutta jos olisi pelkästään time() niin:
time ();

Tomix [11.11.2003 15:09:19]

#

Kerran muinoin tarvitsin omaan projektiini hieman vastaavanlaisen ajastimen. Tuo skripti siihen ei kuitenkaan olisi sopinut, sillä tuo tekee (sen mitä on ohjelmoitu tekemään) _vasta_ sitten kun käyttäjä avaa seuraavan kerran sivun, riippumatta siitä onko ajan umpeutumisesta kulunut minuutti tai viikko. Omassa projektissani tuo olisi pitänyt tapahtua samalla hetkellä kun aika umpeutuu, kuukausien jälkeen totesin sen kuitenkin olevan mahdotonta php:llä.

T.M. [11.11.2003 16:11:35]

#

serialize, unserialize, implode ja trim? Käytä file() funktiota niin pääset eroon noista neljästä ylimääräisestä funktiosta. Sitten vielä pieni kysymys: Mitä iloa on switchin käyttämisestä?
Muuten ok vinkki.

NiKC [11.11.2003 19:18:33]

#

offtopic.

>Käytän aina funktio () jos se on rivin ainoa ja ensimmäinen >suoritettava funktio.

Olis hyvä olla johdonmukanen ja käyttää koko ajan jompaa kumpaa. Itse laitan aina funkkareissa sulkeet kiinni funktionimeen [funktio()] ja ohjausrakenteissa välilyönti väliin [if () jne]. Näin ne erottaa helposti toisistaan ja jopa näyttää ihan hyvältä.

Kryil [11.11.2003 22:28:51]

#

Ajastimen tekeminen pitkienkään aikojen päähän php:llä on mahdollista, mutta se voi muodostua aika taakaksi serverille.
Miten? Simppeliä:
Tehdään sivu, joka tietyn aikavälin jälkeen avaa itsensä, tarkistaa joko aika on kulunut ja tarvittaessa tekee mahdolliset toimenpiteet.
Aika tyhmää, mutta mahdollista.
Jos joku nyt tosissaan alkaa tätä tekemään, muistakin koodata katkaisu looppiin jossain vaiheessa... :)

odys [12.11.2003 09:44:51]

#

lainaus:

serialize, unserialize, implode ja trim? Käytä file() funktiota niin pääset eroon noista neljästä ylimääräisestä funktiosta. Sitten vielä pieni kysymys: Mitä iloa on switchin käyttämisestä?

Ensinnäkin serialize()- ja unserialize()-funktioissa on se etu että muuttujan tietotyyppi säilyy ja dataa on muutenkin helpompi hakea tiedostoissa. (Tämä tulee ehkä parhaiten näkyviin esim taulukoissa, jos siis tallennetaan taulukko tiedostoon)

lainaus:

Olis hyvä olla johdonmukanen ja käyttää koko ajan jompaa kumpaa. Itse laitan aina funkkareissa sulkeet kiinni funktionimeen [funktio()] ja ohjausrakenteissa välilyönti väliin [if () jne]. Näin ne erottaa helposti toisistaan ja jopa näyttää ihan hyvältä.

Juu, tästä lähtien käytän samaa tyyliä kuin sinä, sopii parhaiten minunkin silmään :-)

Ja lopuksi vielä sanottakoon että nämä ovat _koodivinkkejä_ :D
Tämänkin skriptin tarkoitus on auttaa alottelijoita ymmärtämään miten PHP:llä voi "ajastinta" lähteä suunnittelemaan.

enska [16.11.2003 15:51:52]

#

crontabbia kehiin jos halutaan ajaa skripti tiettynä ajankohtana.

odys [21.02.2004 16:44:26]

#

Toi ei toimi kommentti on aika tyhmä.. Tää toimii moitteettomasti ainakin minulla.. voisit kertoa missä menee vituiks.

makas [06.05.2005 18:52:43]

#

Hauska koodi :)

(nimetön) [11.08.2006 22:16:59]

#

Voisko kysyä sellaista, että miten tuon jäljellä olevan ajan saisi näkymään koko ajan näytöllä, ja sen näkisi miten aika vähenisi sekunti kerrallaan 300:sta? Ja haluaisin vielä siten sen, että aika tulisi minuuteissa ja sekunneissa, eli lähtöaika olisi 5:00, 4:59, 4:58 jne...

odys [12.08.2006 16:33:38]

#

PHP:llä ei saa tollasta aikaan koska PHP koodi ajetaan vain kerran serverin puolella kun sivu ladataan.

Tämä ajastin perustuu siihen, että sivun latautuessa katsotaan kauanko aikaa on jäljellä ja tulostetaan sen jälkeen asianmukainen teksti.. Vaikka aika onkin jo loppunut esimerkiksi tunti sitten käyttäjä ei huomaa mitään eroa onko ajastin "reaaliaikainen" vai ei, sillä kun käyttäjä lataa sivun tulee sivulle aina oikeanlainen teksti.

Jos haluat kellon sivuillesi joka päivittyy joka sekunti niin tarvitset toista kieltä, esimerkiksi JavaScriptiä.

(nimetön) [14.08.2006 17:26:24]

#

Olisko mitään vinkkiä, mistä löytyis sellainen javascripti, jolla tuo homma onnistuis?


Sivun alkuun

Vastaus

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

Tietoa sivustosta