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(); ?>
Hyväntuntuista koodia
Pisti silmään toi että välillä käytät funktio() ja välillä taas funktio ().
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 ();
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ä.
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.
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ä.
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... :)
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.
crontabbia kehiin jos halutaan ajaa skripti tiettynä ajankohtana.
Toi ei toimi kommentti on aika tyhmä.. Tää toimii moitteettomasti ainakin minulla.. voisit kertoa missä menee vituiks.
Hauska koodi :)
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...
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ä.
Olisko mitään vinkkiä, mistä löytyis sellainen javascripti, jolla tuo homma onnistuis?
Aihe on jo aika vanha, joten et voi enää vastata siihen.