Alternatief voor cron job

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Danny Spinhuis

Danny Spinhuis

25/03/2018 11:01:37
Quote Anchor link
Hallo allemaal,

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?
 
PHP hulp

PHP hulp

21/11/2024 20:18:05
 
- Ariën  -
Beheerder

- Ariën -

25/03/2018 11:08:14
Quote Anchor link
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. strtotime 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.
Gewijzigd op 25/03/2018 11:11:10 door - Ariën -
 
Ivo P

Ivo P

25/03/2018 11:11:38
Quote Anchor link
Hangt af van wat de job doet.

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
 
Danny Spinhuis

Danny Spinhuis

25/03/2018 12:45:38
Quote Anchor link
- Ariën - op 25/03/2018 11:08:14:
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.
 
- Ariën  -
Beheerder

- Ariën -

25/03/2018 13:04:57
Quote Anchor link
Wat zou je verder willen weten dan?
 
Danny Spinhuis

Danny Spinhuis

25/03/2018 13:21:45
Quote Anchor link
Oke hier komt ie:

- Ariën - op 25/03/2018 11:08:14:
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?
 
Rob Doemaarwat

Rob Doemaarwat

25/03/2018 13:22:09
 
- Ariën  -
Beheerder

- Ariën -

25/03/2018 13:29:20
Quote Anchor link
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.
Gewijzigd op 25/03/2018 13:31:28 door - Ariën -
 
Danny Spinhuis

Danny Spinhuis

25/03/2018 13:39:46
Quote Anchor link
Aha juist ja, oke duidelijk verhaal. Hartelijk dank!
 
Ozzie PHP

Ozzie PHP

25/03/2018 15:53:41
Quote Anchor link
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

25/03/2018 17:04:08
Quote Anchor link
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.
 
Aad B

Aad B

26/03/2018 10:55:35
Quote Anchor link
Danny Spinhuis op 25/03/2018 11:01:37:
Nu vertelde mijn leraar dat er meerdere alternatieven zijn om dit te doen met PHP. Iemand suggesties?
Ik ben heel benieuwd welke meerdere alternatieven er volgens jouw leraar zijn. Ik hoop dat hij uitlegt na je opdracht en dat jij dat hier vertelt.
Sommige alternatieven hierboven beschreven vallen toch wel in de categorie "gekunsteld" omdat er een afhankelijkheid van gebruikers die een pagina opvragen is. Daarbij moet je dan extra programmeren dat de opdracht "gedaan" is voor deze minuut maar nog niet voor de volgende minuut. Kan ook extra vertraging op gaan leveren voor gebruikers. De ene keer is de pagina snel en de andere keer niet omdat de verwerking loopt. Enorm foutgevoelig gedoe. Ben benieuwd naar je leraar....
Zelfs voor de standaard cron is per minuut vaak al heel kritisch en moet je ook zekerheden inbouwen, zie wat Thomas schrijft.
Gewijzigd op 26/03/2018 11:04:23 door Aad B
 
Thomas van den Heuvel

Thomas van den Heuvel

26/03/2018 15:04:34
Quote Anchor link
Inderdaad, naast de (nogal onzekere) afhankelijkheid van bezoekers moet je extra code schrijven die bijhoudt of/wanneer de cron (deze variant wordt ook wel een poor man's cron genoemd geloof ik) voor het laatst is uitgevoerd. Dit is (vermijdbare) extra administratie.

En dan is het dus nog de vraag of het werk dat je met deze cron wil verzetten zich uberhaupt leent voor het mogelijk grillige verloop van het bezoek.

Uit oogpunt van complexiteit is het gewoon veel makkelijker om op gezette tijden een update-script aan te zwengelen via een cron in plaats van elke page-request te kijken of er iets moet gebeuren.

On a side note: iets wat héél belangrijk is is het volgende: de scripts die gebruikt worden voor dit soort crontaken dienen bij voorkeur niet in de publieke webdirectory staan en zouden eigenlijk nooit via een URL uitgevoerd mogen worden (of in ieder geval niet rechtstreeks). Dit hangt wederom van de taken af die zij uitvoeren en hoe dit is ingericht maar zelden tot nooit is het de bedoeling dat deze meer dan één keer binnen een bepaald tijdsbestek (of parallel, for that matter) worden uitgevoerd. Meestal heeft het te vaak uitvoeren van dit soort taken dan ongewenste bijeffecten of haalt het helemaal niets uit.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.