cronjob vraagje
Een heel kort vraagje. Ik heb eigenlijk nooit gewerkt met cronjobs. Een cronjob is eigenlijk toch gewoon een aanroep van een php bestand op een bepaald tijdstip? Kun je in dit bestand ook gewoon classes uit je framework gebruiken?
Alleen een include() / require() wil niet altijd even makkelijk werken als je het script via het pad ophaalt. Dit omdat de cronjobs vanaf een andere locatie worden uitgevoerd. Er zijn diverse manieren om dit goed werkend te krijgen.
- Gebruik eerst een path naar het script in je cronjob-command, en dan je bestandsnaam.
Bijv. cd /home/ozzie/public_html/; php -f cronjob.php
- Gebruik je volledige pad die je handmatig uit $_SERVER['DOCUMENT_ROOT'] haalt. Gebruik deze variabele niet in een cronjob, want dan is deze leeg, of krijg je een verkeerd path. En verwerk dit path in set_include_path():
Code (php)
1
2
3
4
2
3
4
<?php
set_include_path('/home/ozzie/public_html/includes/');
require 'config.inc.php';
?>
set_include_path('/home/ozzie/public_html/includes/');
require 'config.inc.php';
?>
- De current working directory veranderen bovenaan je script:
- Of met 'wget http://www.site.nl/cronjobs/cronjob.php' werken. Maar dan moet je cronjob wel via de webroot bereikbaar zijn (!!) plus dat je gratis nog kan kan krijgen op een timeout van je webserver. En het kost je wat dataverkeer :P
Eigenlijk niet de beste oplossing.
Ikzelf heb altijd het volledige pad gebruikt. Maar dat moet ik nog eens verbeteren met een van deze mogelijkheden.
Gewijzigd op 02/06/2014 11:21:51 door - Ariën -
Cron is een programma dat altijd runt. Het kijkt elke minuut of er (cron)jobs zijn om uit te voeren. Het programma cron zelf weet niks. Het kan ook niks vinden op de schijf. Vandaar dat je altijd in de cronjob de volledige path's moet opgeven. Cron zal in onze situatie's het programma php starten met het path naar het te openen bestand als parameter. Daar kan dus van alles in staan. Gebruik je in dat bestand include's dan zal daarbij zeer waarschijnlijk ook het volledige path nodig zijn.
Toevoeging op 02/06/2014 11:22:11:
SanThe, ook bedankt ;)
In het geval je een php script aanroept via de command line of via een cron opdracht is geen sprake van een document root. Sterker nog: in principe kan een server die geen webserver bevat, maar wel php toch een php-script uitvoeren. In zo'n geval is al helemaal geen sprake van een document-root.
Maar gelukkig bieden de constanten __FILE__ of __DIR__ daar ook uitkomst.
Nog een vraagje. Via de meeste panels kun je ook cronjobs invoeren. Zo ook via bijv. cPanel (zie dit filmpje).
Ik stel me dus voor dat ik als command een bepaald bestand aanroep, bijvoorbeeld:
/home/myproject/private/cronjobs/deletecache.php
Nu vraag ik me af... is het ook mogelijk om als command een bestand op te geven met een extra parameter?
/home/myproject/private/cronjobs/cronjobs.php deletecache
De bedoeling is dan dat het bestand cronjobs.php wordt aangeroepen en dat daar dan op de een of andere manier "deletecache" als parameter aan wordt doorgegeven. Kan zoiets? Of kun je enkel een bestand zonder parameters aanroepen?
Je kan natuurlijk gewoon .../cronjobs.php?deletecache doen.
Dan is het bekend als een GET.
Andere mogelijkheid (ietsje omslachtiger) is vanuit de cronjob een shellscriptje (zelfgeschreven) aanroepen. Daar kun je de parameters wel oppakken. Maar ook dan zal je ze als een GET moeten meegeven aan de php aanroep. Het enige extra dat je dan hebt is dat het shellscript eventueel eerst zelf nog handelingen verricht met de gegeven parameters voordat ie ze aan php geeft.
Ah oke... maar als ik dus via een panel home/myproject/private/cronjobs/cronjobs.php?deletecache als command opgeef, dan wordt deletecache dus een GET parameter, ook al roep je het niet (van buitenaf) via een browser aan???
Verder kun je nog met cURL een HTTP-verzoek verzenden naar een URL in plaats van een lokaal pad. Ook een omweg als het je eigen server is, maar het kan:
Sorry, ben het even aan het testen, maar het werkt niet.
@Ward:
>> Het kan inderdaad met een vraagteken óf een spatie: beide even testen.
Ik kan het niet handig testen, maar verschilt dit per panel?
>> Verder kun je nog met cURL een HTTP-verzoek verzenden naar een URL in plaats van een lokaal pad. Ook een omweg als het je eigen server is, maar het kan:
Ah oké. Maar dat lijkt me niet helemaal lekker, want dan kan iemand van buitenaf een cronjob starten....
@SanThe:
>> Sorry, ben het even aan het testen, maar het werkt niet.
Oh, da's balen :(
En zoals Ward zegt met een spatie?
Je wilt deletecache meegeven. Ik neem aan om de cache te deleten. Waarom maak je dan niet een apart php bestandje dat alleen de cache weggooit en zet je die aanroep in de cron?
Dit is enkel een voorbeeldje. Ik gebruik een framework en ik wil dat framework ook kunnen gebruiken bij het uitvoeren van een cronjob. Ik zou dan dus een algemene cronjob file willen aanroepen die alvast een aantal standaardhandelingen verricht (bijv. de autoloaders setten) zodat ik de library kan gebruiken. Daarom lijkt het me dus handig als ik dat algemene bestand aanroep met een parameter. Dan worden dus de standaardhandelingen uitgevoerd en wordt vervolgens (op basis van de parameter) het specifieke cronjob bestand aangeroepen.
Ik zou het ook andersom kunnen doen, dus meteen het specifieke bestand aanroepen, en vanuit dat bestand dan weer het algemene bestand requiren, maar dan zou ik dat bij ieder cronjob bestand moeten doen en dat lijkt me niet echt efficiënt.
Ozzie PHP op 04/06/2014 13:42:42:
... en wordt vervolgens (op basis van de parameter) het specifieke cronjob bestand aangeroepen ...
Deze snap ik even niet.
Is het nu duidelijker wat ik bedoelde?
Kijk hier voor een de documentatie http://www.php.net/manual/en/features.commandline.introduction.php .
En hier voor nog een stukje uitleg waar je snel mee aan de slag mee moet kunnen http://www.php.net/manual/en/reserved.variables.argv.php .
Kijk zeker eens naar het Symfony Console Component. http://symfony.com/doc/current/components/console/introduction.html
Aan een command line commando kun je ook parameters mee geven:
/usr/bin/php script.php
is al een eerste voorbeeld: aan php wordt script.php meegegeven als parameter :-)
Met $argv http://nl1.php.net/manual/en/reserved.variables.argv.php en aanverwant vind je de het aantal parameters en hun inhoud
Ozzie PHP op 04/06/2014 12:56:45:
Nu vraag ik me af... is het ook mogelijk om als command een bestand op te geven met een extra parameter?
/home/myproject/private/cronjobs/cronjobs.php deletecache
/home/myproject/private/cronjobs/cronjobs.php deletecache
Ik denk dat je eens moet kijken naar $argv.
dit filmpje) is dat dan eigenlijk ook een cli opdracht? In het filmpje lijkt het alsof ze gewoon een path opgeven. Maar als ik jullie goed begrijp dan zou ik daar bij "Command" dus dit kunnen invullen
/home/myproject/private/cronjobs/cronjobs.php deletecache
En dat ik dan via $argv die "deletecache" parameter weer ergens kan terugvinden. Correct?
Toevoeging op 04/06/2014 14:09:19:
>> Deze is het gewoon http://www.php.net/manual/en/reserved.variables.argv.php
Getest en werkt.
En dan los van elkaar of met een vraagteken?
Ah oke... en als ik het via cPanel doe (zie /home/myproject/private/cronjobs/cronjobs.php deletecache
En dat ik dan via $argv die "deletecache" parameter weer ergens kan terugvinden. Correct?
Toevoeging op 04/06/2014 14:09:19:
>> Deze is het gewoon http://www.php.net/manual/en/reserved.variables.argv.php
Getest en werkt.
En dan los van elkaar of met een vraagteken?
/path/naar/php/php /path/naar/bestand/test.php parameter1 parameter2