Cronjobs

Cronjob DirectAdmin Cronjob Cpanel Cronjob Plesk PHP Cronjob vragen

Algemene uitleg betreffende cronjobs:

Wanneer wel, wanneer niet?
Misschien wel belangrijker dan de uitleg hoe je een cronjob maakt, zijn de redenen waarom je hem niet zou maken. Vaak wordt cron gebruikt voor toepassingen die helemaal geen cron vereisen en de applicatie of de website daardoor alleen maar onnodig ingewikkeld maken. Zo zul je bijvoorbeeld geen cron nodig hebben voor periodieke acties die niet periodiek uitgevoerd hoeven te worden, en sommige vormen van caching. Dat vraagt misschien om een kleine toelichting.

Periodieke acties die niet periodiek uitgevoerd hoeven worden? Dit zijn berekeningen of bewerkingen die afhankelijk zijn van een tijdsinterval, maar waarbij het niet nodig is om dat ook op dat moment uit te voeren. Het is bijvoorbeeld niet nodig om een tabel uit je database elke dag, week of maand te legen, gebruik daarvoor liever de datum functies van je database. Een ander voorbeeld is het uitdelen van salaris. Het gaat er bij het salaris niet om wanneer het uitgedeeld wordt, maar dat het uitgedeeld wordt. Je krijgt als bezoeker je salaris over het aantal periodes dat je nog geen salaris hebt gehad. Je hebt het salaris pas nodig als je je saldo opvraagt, dus bereken je bij het opvragen hoelang iemand al geen salaris heeft gehad en tel je het salaris op bij het saldo. Anders gezegd maakt het niet uit of je elke dag 30 euro op je rekening gestort krijgt of 90 euro als je pas na drie dagen kijkt wat je saldo is.

Een andere toepassing waarvoor cron niet gebruikt moet worden is het cachen van pagina's, afbeeldingen of templates. Althans, niet als kan worden bepaald of de cache verouderd is. Wil je bijvoorbeeld van een externe site, met toestemming van de eigenaar, een grafiek laten zien, dan kun je de grafiek met een bepaald interval downloaden en cachen op je eigen server. Dit doe je dan om de bezoeker niet te hinderen met het trage ophalen van de afbeelding. Ga je zelf je eigen HTML pagina's cachen, dan werk je niet met cron, maar laat je je script kijken of de gecachete pagina verouderd is. Dat kan bijvoorbeeld door te kijken naar de creatietijd van het cache bestand en de tijd van de laatste actie in de database. Afhankelijk daarvan maak je het cache bestand opnieuw en laat je het zien.

Als laatste valkuil voor cron zijn de scripts die blijkbaar elke minuut uitgevoerd moeten worden. Als je dit wil maak je zeer waarschijnlijk een denkfout en ben je bezig een periodieke actie periodiek uit te voeren terwijl dat niet hoeft. Is dat niet het geval, dan moet je nog steeds geen cron gebruiken maar kun je beter een daemon schrijven. Hoe dat moet kun je vast ergens op internet vinden.

Cron gebruik je dus voor acties die je periodiek wil uitvoeren en die ook periodiek uitgevoerd moeten worden. Voorbeelden hiervan zijn bijvoorbeeld het maken van backups van je scripts en de database of het maken van historische statistieken. Waar cron ook zeer geschikt voor is, zijn mailinglijsten en het mailen van rapporten of logbestanden van je site, waardoor je op gezette tijden automatisch op de hoogte wordt gebracht van de status van je website. Als laatste voorbeeld wil ik nog het opschonen van de database noemen, waarbij je moet letten op het verschil tussen opschonen en legen van de database. Onder opschonen valt het verwijderen van records die verouderd zijn of simpelweg niet meer nodig zijn, maar waarbij het wel of niet verwijderen ervan geen invloed heeft op de werking van de website. Vergeet ook niet dat een database geen problemen heeft met tabellen van miljoenen records.

Een leuke manier om te kijken of een hoster cron aanbiedt is kijken of de websites trager worden rond middernacht. Wat vaak gebeurt is dat mensen een cronjob laten uitvoeren om middernacht. Als maar genoeg webmasters dat doen, wordt de server vanzelf trager. Het is dus aan te bevelen de cronjob enkele minuten tot uren na middernacht uit te voeren. Als je je cronjob in de nacht van zaterdag op zondag uitvoert, hou dan rekening met zomer- en wintertijd. Bij het ingaan van de zomertijd zullen cronjobs tussen 2 en 3 uur niet worden uitgevoerd, bij het ingaan van de wintertijd worden ze dubbel uitgevoerd tussen 2 en 3 uur.

Hoe moet het dan?
Als je hoster je een mooi control panel voorschotelt is het niet al te moeilijk om een cronjob in te stellen, je moet alleen wel weten wat waar ingevoerd moet worden. Heb je SSH toegang tot de server, dan kun je het ook via de Command Line Interface (CLI) doen. Log in op de server en tik in:
crontab -e
Vervolgens zul je je crontable te zien krijgen in je favoriete editor, standaard is dat vi. Deze kun je instellen in het bestand .bash_profile. Zet hiervoor aan het eind van het bestand:
export EDITOR=pico
Je kunt deze regel uiteraard ook gewoon elke keer dat je hem nodig hebt intikken. De editor moet natuurlijk wel geïnstalleerd zijn en niet elke editor zal hiervoor geschikt zijn.

Maar of je nu via een control panel of een editor de crontable bewerkt, je zult dezelfde velden moeten invullen. Voor gewone stervelingen is de crontable opgedeeld in 6 kolommen:
<minuten> <uren> <dagen> <maanden> <weekdagen> <commando>
Deze 6 kolommen kun je weer opdelen in 2 groepen, namelijk het "wanneer" en het "wat". Het "wat" is het eenvoudigst, maar toch weer lastig. Het is namelijk gewoon een commando zoals je dat ook op de CLI zou kunnen opgeven. Op Unix systemen is cron een veelgebruikt programma om bijvoorbeeld logbestanden te archiveren. Je kunt voor <commando> dus alles invullen wat op de CLI ook werkt, mits de gebruiker die de cron uitvoert ook gerechtigd is om het programma uit te voeren. Je kunt hiermee dus bijvoorbeeld ook mysqldump uitvoeren om een backup van je database te maken, want dat doe je uiteraard niet met een PHP script. Let er op dat als je de inloggegevens van je database meegeeft aan mysqldump, dat deze dan tijdens het uitvoeren voor iedereen met toegang tot de CLI leesbaar kunnen zijn. Hoe je nu PHP scripts uit kan voeren met cron leg ik later uit. Het "wanneer" is dus verdeeld in 5 kolommen en elke kolom kan op dezelfde manier worden ingevuld. Voor het aangeven van de momenten waarop de cronjob moet worden uitgevoerd kun je gebruik maken van getallen, het sterretje (*) als wildcard, de komma (,) om waardes te plakken, het minteken (-) om een range aan te geven en de slash (/) voor intervallen. Aan de hand van wat voorbeelden wil ik duidelijk maken hoe je de cronjob kan instellen qua tijd.
1 2 3 4 5               Elke vrijdag (5) die op 3 april (4) valt om 1 minuut over 2
30 4 * * *              Elke dag om half 5 's nachts
30 4-6 * * *            Elke dag om half 5, half 6 en half 7
30 4-8/2 * * *          Elke dag om half 5, half 7 en half 9
30 4,6,8 * * *          Elke dag om half 5, half 7 en half 9
0 15,20 * */2 1-5       Wordt op werkdagen in de even maanden op elke dag 
                             (van de maand) uitgevoerd om 15:00u en om 20:00u.
*/10 8-16,22 * * *      Het commando wordt elke 10 minuten uitgevoerd 
                             tussen 8:00u en 16:59u en tussen 22:00u en 22:59u.


PHP uitvoeren
Als je PHP bestanden wil gaan uitvoeren via een cronjob kan dat op twee verschillende manieren. De meest makkelijke en efficiënte manier is het direct uitvoeren van het script via de parser. Hiervan zijn twee varianten. Een andere, wat minder elegante, methode is het simuleren van de browser.

Het script uitvoerbaar maken

Voor deze methode en de volgende zul je moeten weten waar de PHP parser staat. Als je SSH toegang hebt kun je deze zelf zoeken (find / -name php) en anders zul je een mailtje moeten sturen aan je hoster. In je PHP script kun je aangeven waar de parser staat en bash ("Dos" :S) zal je script aan de parser doorgeven. Zet hiervoor op de eerste regel van je script enkel en alleen:
#!/pad/naar/php/parser
Vervolgens moet je het script nog uitvoerbaar maken. Hoe dit moet hangt een beetje af van de indeling van het systeem en kun je daarom beter in overleg met je hoster doen. Wil je dit zelf doen, lees dan eerst een artikel over het rechtensysteem van Linux of Unix.

Het voordeel van deze methode is dat je het script ook buiten de document root kan zetten, waardoor het niet meer via een webbrowser uit te voeren is. Voor het commando in de cronjob geef je het absolute pad naar het script op:
10,20 */2 * * * /pad/naar/php/script

Direct aan de parser voeren

Deze methode is bijna gelijk aan de vorige. Het enige verschil is dat je het pad naar de PHP parser opgeeft bij het commando voor de cronjob. Deze methode biedt het voordeel dat je ook extra parameters mee kan geven aan de parser. Zo kun je bijvoorbeeld safe_mode uitzetten of andere instellingen wijzigen. Hoe dat moet kun je vinden op de manpage (zoek op "man php") van PHP vinden. Bijvoorbeeld:
30 4 * * 1-5 /pad/naar/php/parser /pad/naar/php/script
Je hoeft het PHP script dan niet uitvoerbaar te maken maar kunt het nog wel buiten de document root zetten.

Wget

Weet je niet waar de PHP parser staat of heb je bepaalde zaken nodig die de webserver je biedt, dan kun je tenslotte nog een webbrowser nadoen. Met het programma wget kun je een pagina opvragen en dus je script uitvoeren. Deze methode werkt niet altijd, niet alle hosters staan het gebruik van wget toe en je moet wel weten waar dit programma staat. Meestal is dat overigens /usr/bin/wget. Bedenk wel dat deze methode nogal een omweg is: je moet het script opvragen via wget, die de webserver moet raadplegen die op zijn beurt de PHP parser aanspreekt.
*/10 9 * 1-6 * /pad/naar/wget -O /dev/null -q http://www.url.nl/script.php
Met het argument -O /dev/null vertel je dat wget de output van je script moet schrijven naar de prullenbak, met -q geef je aan dat je geen foutmeldingen wil zien.

Bronvermelding: phpfreakz


DirectAdmin



Onder "Advanced Tools" uit het hoofdmenu vindt u het "Cron Jobs" icoon.

Een cron job is een commando dat op een door u aangegeven tijdstip automatisch zal worden uitgevoerd. Als u bijvoorbeeld elke maandagochtend een CGI-script wilt draaien, kunt u dat regelen via een cron job. U kunt kiezen voor minuut, uur, dag, maand en dag van de week (maandag t/m zondag, waarbij de nummers 0 of 7 de zondag aanduiden). Om een waarde weg te laten, vult u een asterisk (*) in:

In bovenstaand voorbeeld laten we updater.cgi elke dag uitvoeren om precies middernacht.

Meerdere tijdstippen duidt u aan door middel van komma's: 1,2,3 bijvoorbeeld, duidt op de minuten 1, 2 en 3.

Een bepaalde tijdspanne geeft u aan met een koppelteken: bijvoorbeeld 5-7 staat voor de minuten 5 t/m 7.

Tijdsintervallen geeft u aan door middel van een sterretje en een voorwaartse schuine streep: bijvoorbeeld */2 staat voor elke 2e minuut.

Door gebruik te maken van combinaties kunt u een zeer precies schema plannen. Bijvoorbeeld 1,5,11-15,30-59/2 staat voor: de minuten 1, 5, 11 to 15 en elke 2e minuut tussen 30 en 59.

Vergeet niet om wanneer u alle gegevens heeft ingevoerd te klikken op "Add" ("Toevoegen").

Zeer belangrijk is om bij command het volgende in te vullen:
/usr/local/bin/php -q -f /home/*gebruikersnaam*/domains/*domein.nl*/public_html/cronjob.php *

* Vervang hierbij: *gebruikersnaam* door je directadmin gebruikersnaam en *domein.nl* door je domeinnaam. Voorbeelden: minute - de waarde in minuten waarop de cronjob moet worden uitgevoerd. (* is elke minuut)
hour - de waarde in uren waarop de cronjob moet worden uitgevoerd. (* is elk uur)
day of month - de dag van de maand waarop de cronjob uitgevoerd moet worden. (* is elke dag)
month - de maand waarin de cronjob moet worden uitegevoerd (* is elke maand)
day of week - de dag van de week waarop de cronjob uitgevoerd moet worden (* is elke dag)


minute - 0
hour - 0
day of month - *
month - *
day of week - *
Dit geeft als resultaat dat de cronjob elke dag uitgevoerd wordt om 0:00

minute - *
hour - *
day of month - *
month - 10
day of week - 1
dit geeft als resultaat dat de cronjob elke minuut uitgevoerd wordt, maar wel met de beperking dat het de 10e maand moet zijn en alleen op maandag.

minute - 14
hour - 30
day of month - 1
month - *
day of week - *
dit geeft als resultaat dat de cronjob elke 1e dag van de maand om 14:30 uitgevoerd wordt ongeacht de maand of dag van de week.


Cpanel

This tutorial assumes youíre using cPanel, one of the most popular hosting control panels. If youíre on a shared hosting plan, thereís a good chance your host uses cPanel (some popular hosts, like DreamHost and GoDaddy, donít). But even if you donít have cPanel, your control panel will probably let you create cron jobs without knowing Unix, in a way similar to what Iíll describe below.

Note:If youíre looking for a host, itís a good idea to find one that uses cPanel; once you become familiar with it, itís easier to change hosts if you find out yours sucks and you have to move to another one (be sure to read How to Find a Web Host That Doesnít Suck).

Letís get started. Log in to your cPanel and look for the Cron Jobs icon:

cPanel Cron Jobs

Click on the image and youíll be asked to choose your experience level. If youíre reading this, you want to click on Standard.

Creating a Cron Job

Now that youíre at the Standard Cron Manager, letís create a cron job. You can set a job to run at a specific interval or at a specific times. Creating a cron job requires only three simple steps (see picture below):



Cron job

1. Enter your email address where it says: Please enter an email address where the cron output will be sent. Cron will send you a message when the job is executed, so youíll know if there are any errors. 2. In the Command to run: field, enter the full path to your script (you may need to check with your host for this).

If you want to run a php file, the command will begin with php. For example, if you want to run RSS Import to update your Pligg feeds, youíd enter php and the path to your import_feeds.php file.

On AN Hosting, your path would look something like this:

php /home/[your username]/public_html/rss/import_feeds.php.

If you want to run the automatic backup script, which backs up your MySQL database and emails a copy to you (see 8 MySQL Backup Strategies for WordPress Bloggers (And Others), strategy #7), youíd enter /bin/sh (since this is a shell script), and the path to your script.

On AN Hosting, your path would look something like this:

/bin/sh /home/[your username]/etc/upstart_cron_backup.sh 3. Now you need to set the schedule. * Set the Minute(s). You can set a short interval here, or minutes of the hour (you can select multiple items in thisóand the otheró boxes by using the Shift and Command keys). If you donít care about minutes, leave this set to 0).

If you want to test things, set this to run Every Five Minutes. This is a good interval for running the script, checking your email for errors, and changing settings before your inbox gets inundated with cron messages. * Set the Hour(s). If youíre creating a cron job to run RSS Import, you might want to set this to Every Hour. If youíre setting up a backup script, you might choose an hour in the middle of the night for nightly backups. * Set the Day(s). Youíll probably want to leave this set to Every Day, but you can also choose specific days of the month. * Set the Weekday(s). * Set the Month(s).

When youíve set the schedule, your cron job is done. Click the Save Crontab button. If you set it to a short interval for testing, you should have an email with your output within a few minutes. If thereís an error (usually a problem with your path), check your settings.


Plesk

/usr/bin/php -q /home/httpd/vhosts/domein.ext/httpdocs/mijn_script.php >> /home/httpd/vhosts/domein.ext/httpdocs/script_log.txt

/usr/bin/php -q Dit is het pad naar php. Als het een standaard Plesk systeem betreft kan dit bij jou best wel eens hetzelfde zijn.
/home/httpd/vhosts/domein.ext/httpdocs/mijn_script.php Het lokaal pad naar je script. Via de phpinfo kan je dit wel ergens opzoeken waarschijnlijk.
>> /home/httpd/vhosts/domein.ext/httpdocs/script_log.txt Dit voegt alle output van het script toe aan een bestand "script_log.txt". Best wel handig


Computerhulp Dieren - Computerhulp Doesburg - Computerhulp Rheden - Computerhulp Velp - Computerhulp Arnhem