Voor mijn implementatie heb ik een cron job gebruikt die om de minuut een script uitvoert. Nu vertelde mijn leraar dat er meerdere alternatieven zijn om dit te doen met PHP. Iemand suggesties?
Het kan wel, maar het heeft wel beperkingen, want een cronjob draait altijd op de afgesproken tijd, onafhankelijk hoe vaak de website bezocht wordt. Het is namelijk een aparte service ('deamon' in Linux-jargon) die voor deze tijdsgebonden taken zorgt.
Je kan wel een dergelijke mogelijkheid in PHP bouwen, maar dan ben je wel afhankelijk van je bezoekers, en dan is er ook een kans dat je scripts niet op de juiste tijden worden gedraaid. Tevens draaien de scripts dan als proces binnen PHP wat niet altijd verstandig is, plus dat je niet zomaar alle taken kan uitvoeren omdat je webserver (hopelijk!) niet als root zal draaien. Dit betekent ook dat als je zware taken zou draaien, dat deze via het proces van de bezoeker worden gedraaid. Als dit zware scripts zijn, dan zal je bezoeker dus een lange laadtijd kunnen ervaren.
Maar als je het vanuit PHP wilt dan, dan kan je heel simpel kijken naar de tijd dat iets ingepland is, en of deze verstreken is. [php]strtotime[/php] is een handige functie hiervoor. Hoe je de taken bijhoudt, dat is aan jouw vrijheid verder. Dit kan met een simpel tekstbestandje, maar ook in een database.
Vergeet niet als een taak afgelopen is om dit netjes af te vinken, anders blijft deze worden gedraaid.
Verder is het altijd verstandig om na te denken of een cronjob echt elke minuut moet worden gedraaid. Vaak is hier een logische oplossing voor om dit overbodig te maken.
Berucht is het bijwerken van saldo.
Als je elke mknuut een euro verdient, kun je elke minuut van alle gebruikers het saldo bij werkwn.
Je kunt ook bij het willen kopen van iets constateren dat hij 100 minuten geleden in het bezit was van 1000 euro en dat dat nu dus 1100 oet zijn.
Hij koopt nu iets van 500 dus sla je op dat zijjn saldo om 11u11 vandaag 600 is.
Volgende keer baseeer je je oo die 600 en het tijdstip
Je kan wel een dergelijke mogelijkheid in PHP bouwen, maar dan ben je wel afhankelijk van je bezoekers, en dan is er ook een kans dat je scripts niet op de juiste tijden worden gedraaid. Tevens draaien de scripts dan als proces binnen PHP wat niet altijd verstandig is, plus dat je niet zomaar alle taken kan uitvoeren omdat je webserver (hopelijk!) niet als root zal draaien. Dit betekent ook dat als je zware taken zou draaien, dat deze via het proces van de bezoeker worden gedraaid. Als dit zware scripts zijn, dan zal je bezoeker dus een lange laadtijd kunnen ervaren.
Dit klinkt erg interessant om mijn verhaal te verdedigen :) zou je hier wellicht wat dieper in detail kunnen treden aub? Dat zou ik enorm waarderen.
maar dan ben je wel afhankelijk van je bezoekers, en dan is er ook een kans dat je scripts niet op de juiste tijden worden gedraaid. waarom precies?
Tevens draaien de scripts dan als proces binnen PHP wat niet altijd verstandig is dus een cron job is de enige manier, waarmee er niet altijd een proces draaiende?
Omdat een PHP-script wordt aangeroepen op het moment dat het gebeurt. Je bezoekers zorgen ervoor dat het script gedraaid wordt. Heb je geen bezoekers, dan wordt het script nooit gedraaid, ook niet op je geplande tijdstip.
En cronjob is de enige manier om er zeker van te zijn dat je script exact uitgevoerd wordt op het moment dat het gepland is, en dat doet de cronjob-deamon helemaal zelf.
Anders gezegd ... een cronjob gebruik je om taken uit te voeren die NIET afhankelijk zijn van het feit of er wel of geen bezoekers op de website zijn.
Een voorbeeld is het versturen van een nieuwsbrief. Die wil je bijvoorbeeld iedere woensdagnacht om 3.00 uur versturen. Daar gebruik je dan een cronjob voor.
Voor zaken die wél afhankelijk zijn van het feit of er iemand aanwezig is op de site, kun je andere methodes gebruiken om de pagina te verversen. Denk bijvoorbeeld aan een chatfunctionaliteit.
Het is ook belangrijk om hierbij de volgende vragen te stellen:
- hoe belangrijk is het dat de cron altijd op een gezette tijd wordt uitgevoerd
Is het bijvoorbeeld toegestaan dat een cron een keer wordt gemist?
Zonee, dan is het zaak dat er een monitorsysteem is die dit detecteert. Of het is in ieder geval handig/verstandig om een log bij te houden die registreert wat er dan wel gebeurt zodat je kan terugzoeken dat deze een keer niet is doorgeggaan.
Zoja,
- is dit dan van invloed op een volgende cron? Moeten bepaalde taken dan meerdere keren worden uitgevoerd, zoals het (vaker) ophogen van tellers zoals @Ivo aangeeft
- dient de data waarop de cron van invloed is vergrendeld te worden tijdens de uitvoering? je wilt namelijk mogelijk geen inmenging van buitenaf die de toestand van de data beinvloedt terwijl een cron daarmee bezig is; daartoe zou je een semafoor kunnen gebruiken, en database-transacties
- wat dient er te gebeuren als een cron om wat voor reden nog bezig is als de volgende cron wordt gestart? mogelijk moet je dan het interval tweaken (als dat mogelijk is) of code efficiënter maken, of iets anders, eerdergenoemde semafoor kan dan ook uitkomst bieden zodat te allen tijde eenzelfde cron maximaal 1x parallel actief is
Maar dit alles hangt wederom af van het gedrag van het script / de data die door de cron wordt aangezwengeld, ook hier is geen universeel recept voor. Dit is gedrag van de applicatie en daarmee applicatie-specifiek.