Polovica težav v produkciji izvira iz cron opravil, ki ne delujejo, kot bi morala. WP-Cron čaka na ustavitev prometa, Laravel razporejevalnik brez nadzornika, koledarska opravila, ki bi jim morala biti poslana opomnika, vendar niso bila. To je vodnik o tem, kako pravilno nastaviti in spremljati razporejena opravila.
Kaj je cron in kako deluje?
Cron = Unixov razporejevalnik, ki izvaja ukaze ob določenem času. Oblika:
* * * * * command │ │ │ │ │ │ │ │ │ └─ day of week (0-7) │ │ │ └─── month (1-12) │ │ └───── day of month (1-31) │ └─────── hour (0-23) └───────── minute (0-59)Primeri:
-
0 * * * *— vsako uro ob :00. -
*/15 * * * *— vsakih 15 minut. -
0 3 * * *— vsak dan ob 3. uri zjutraj. -
0 0 * * 0— Ob nedeljah ob polnoči. -
30 2 1 * *— prvi dan v mesecu ob 02:30.
Orodja za testiranje: crontab.guru — vizualno razloži kateri koli izraz cron.
Cron opravila cPanel
V cPanelu: Napredno → Cron opravila . Dodajte obrazec s spustnimi seznami za minute/ure/dan.
Tipičen vnos v WP cron:
*/5 * * * * cd /home/USER/public_html && /usr/local/bin/php -q wp-cron.php >/dev/null 2>&1Tipičen razporejevalnik v Laravelu:
* * * * * cd /home/USER/app && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1Česa NE smete početi v cronu cPanela
- Ne pošiljajte izpisov v e-pošto, razen če resnično želite prejemati neželeno pošto v mapi »Prejeto«. Privzeti izpis cron se pošlje v e-pošto cPanel.
- Ne poskušajte z
*/1 * * * *, če ima deljeno gostovanje minimalno politiko 5 minut (skrbnik cPanela lahko to omeji). - Ne izvajajte več nalog z isto nalogo, ki zahteva veliko virov, v isti minuti – preobremenitev strežnika.
WP-Cron — problematična privzeta nastavitev
WordPress ima vgrajen "cron" — wp-cron.php . AMPAK: TO NI pravi cron. WP-Cron se zažene le , ko nekdo obišče spletno mesto . Posledice:
- Spletna mesta z nizko stopnjo prometa: načrtovane objave niso objavljene pravočasno, avtomatizirana e-poštna sporočila niso poslana, prehodne napake niso odpravljene.
- Velik promet: WP-Cron se zažene pri vsaki (približno deseti) zahtevi, kar poveča zakasnitev.
- E-poštna obvestila WooCommerce o naročilih se lahko zakasnijo za več ur, če nihče ne obišče spletnega mesta.
Pravilna nastavitev WP-Cron
- V datoteki
wp-config.phpdodajte:define('DISABLE_WP_CRON', true); - V cPanel cron dodajte opravilo, ki prek CLI zažene
wp-cron.phpvsakih 5 minut. - Rezultat: cron deluje predvidljivo, neodvisno od prometa.
Razporejevalnik Laravel
Laravel ima elegantno abstrakcijo cron. V routes/console.php (ali v Console/Kernel.php v stari različici):
Schedule::command('reports:generate')->daily(); Schedule::command('queue:prune-batches')->hourly(); Schedule::call(fn() => Cache::flush())->weekly();Vse to se izvaja z ENIM vnosom v cron:
* * * * * cd /path/to/app && php artisan schedule:run >> /dev/null 2>&1Laravel sam odloči, kateri ukaz se zažene v kateri minuti. Čudovito.
brez prekrivanja
Če ukaz traja 7 minut in se sproži vsakih 5 minut – zaženete ga dvakrat vzporedno, izguba virov, stanje tekme. Odločitev:
Schedule::command('long:task')->everyFiveMinutes()->withoutOverlapping();Ključavnica se hrani v predpomnilniku (Redis ali datoteka).
onOneServer (nastavitev več strežnikov)
Če Laravel deluje na več strežnikih z uravnoteženo obremenitvijo, se cron izvaja na vsakem od njih – dvojniki. Odločitev:
Schedule::command('reports:send')->daily()->onOneServer();Ključavnica se hrani v skupnem predpomnilniku (Redis), izvaja jo samo en strežnik.
Delavci čakalne vrste – drugače kot cron
Cron = sprožilec ob določenem času. Čakalna vrsta = opravilo, ki se izvede, ko je prisoten delavec.
Primeri uporabe čakalnih vrst:
- Pošiljanje e-pošte (ne blokirajte uporabniške zahteve).
- Obdelava slik (spreminjanje velikosti, vodni žig).
- Integracija API-ja (klic API-ja tretje osebe s ponovnim poskusom).
- Obvestila.
Nastavitev čakalne vrste Laravel
Možnosti zalednega sistema: Redis (najboljše), baza podatkov, SQS. config/queue.php → privzeto 'redis'.
Delavec mora neprekinjeno teči:
php artisan queue:work --queue=high,default,low --sleep=3 --tries=3Vendar se bo proces ustavil (puščanje pomnilnika, ponovni zagon namestitve, ponovni zagon strežnika). Potreben je nadzornik .
Nastavitev nadzornika
/etc/supervisor/conf.d/laravel-worker.conf :
[program:laravel-worker] process_name=%(program_name)s_%(process_num)02d command=php /path/to/app/artisan queue:work --sleep=3 --tries=3 autostart=true autorestart=true numprocs=4 user=www-data redirect_stderr=true stdout_logfile=/var/log/laravel-worker.logUkazi:
supervisorctl reread supervisorctl update supervisorctl start laravel-worker:*Laravel Horizon (samo Redis)
Spletna nadzorna plošča za spremljanje čakalne vrste + vgrajena logika nadzornika. Najboljše za produkcijske Laravel aplikacije.
composer require laravel/horizon php artisan horizon:install Deluje s php artisan horizon (in ga mora vzdrževati nadzornik).
Spremljanje opravil cron
Cron, ki ne deluje, je tiha napaka. Nadzorovati ga je treba.
Healthchecks.io
Vsakič, ko se cron zaključi, pošlji zahtevo HTTP na URL. Če Healthchecks ne prejme pinga v pričakovanem intervalu, pošlje opozorilo.
0 3 * * * /path/to/script.sh && curl -fsS --retry 3 https://hc-ping.com/UUIDBrezplačni pregledi 20. stopnje. Na voljo je tudi možnost samostojnega gostovanja.
Kronist
Podobno kot Healthchecks, lep uporabniški vmesnik, samo gostovanje.
Boljši utripi srca
Že uporabljate Better Stack za zagotavljanje razpoložljivosti? Dodajte srčne utripe za spremljanje crona.
Laravel izvorno
Laravelov razporejevalnik ima kljukice onSuccess in onFailure . Preverjanjem stanja lahko povežete neposredno s pingom ali pa pošljete obvestila prek Slacka.
Sistemski cron v primerjavi z aplikacijskim cronom
- Sistemski cron (Linux
/etc/cron.d/) – za vzdrževanje sistema (rotacija dnevnikov, varnostno kopiranje, posodobitev operacijskega sistema). Ne za logiko aplikacij. - cPanel cron – za posamezno aplikacijo/račun. Na uporabnika.
- Razporejevalnik na ravni aplikacije (Laravel, Django Celery beat) – za poslovno logiko, najprej koda, nadzor različic.
Pravilo: poslovni croni ne smejo biti v sistemskem crontabu – potem jih ni v gitu, saj se med selitvijo strežnika izgubijo.
Pasti
- Časovni pas: cron uporablja strežnik TZ. Nastavite strežnik TZ (Evropa/Zagreb) ali uporabite cron v UTC in izračunajte. Najlažje: strežnik v Evropi/Zagrebu.
- POT: okolje cron je minimalno. Morda
phpne deluje, potrebna je celotna pot/usr/local/bin/php. - Delovni imenik: cron ne ve, kje naj ga zažene. Vedno uporablja
cd /path/to/appali absolutne poti. - Tiha napaka: če skripta ne uspe, cron preprosto izbriše izhod. Vse zapiši v dnevnik.
- Prekrivanje: dolgo opravilo + hiter interval = vzporedni primerki, stanje tekme. Uporabite datoteko zaklepanja ali
flock. - Neželena e-pošta: privzeti izpis crona se pošlje na e-pošto. Če ne želite prejemati e-pošte, dodajte pripono
>/dev/null 2>&1
Najboljše prakse
- Vsako opravilo cron mora imeti nadzor nad različicami (v kodi aplikacije prek razporejevalnika Laravel ali v skriptu za uvajanje).
- Vsako opravilo cron mora oddati ping (Healthchecks.io, Better Stack).
- Vsako opravilo cron mora beležiti začetek, zaključek in napake.
- Dolgotrajni croni (>1min) →
withoutOverlapping. - Kritični kroni → opozorilo o napaki (Slack, e-pošta).
- Pred uvedbo: preizkusite nova cron opravila na uvodni fazi pred produkcijo.
Upravljanje orožja za množično uničevanje in cron
Vsa gostovanja WMD WordPress imajo privzeto nastavljeno DISABLE_WP_CRON + sistemsko opravilo cron za wp-cron.php . Za odjemalce Laravel nastavimo schedule:run crona + Supervisor za delavce čakalne vrste + nadzorna plošča Horizon. Integracija Healthchecks.io je vključena v načrt vzdrževanja – vsak kritični cron se spremlja in opozori, če ni pingan v 2-kratnem intervalu. Nastavitev časovnega pasu, rotacija dnevnikov, načrtovani mesečni pregled cronove.
Pogosta vprašanja
Ali se WP-Cron lahko izvaja na produkcijski lokaciji? Ne, onemogočite ga (definirajte DISABLE_WP_CRON) in nastavite sistemski cron. Privzeto delovanje je nezanesljivo.
Kaj pa, če odjemalec nima SSH dostopa za nadzornika? Uporablja cPanel Application Manager (Node) ali skupno logiko cron + ponovni zagon v skripti. Ni idealno, vendar deluje za majhne količine čakalnih vrst.
Ali lahko imam cron v Dockerjevem vsebniku? Da, ampak bolje: uporablja gostiteljski cron, ki izvaja docker exec , ali namenski vsebnik razporejevalnika (k8s CronJob). Cron znotraj vsebnika aplikacije je antivzorec.
Kako pogosto lahko zaženem cron? Standardni minimalni interval je 1 minuta. Če ga potrebujete pogosteje, namesto crona uporabite dolgo delujoč proces demona z zanko sleep(30).
Stanje tekme pri prvem zagonu delavca čakalne vrste? Preverite schedule:run , zaklenite datoteke v storage/framework/. Poskusite php artisan queue:restart po uvajanju, da vsi delavci prevzamejo novo kodo.
Potrebujete ustrezno nastavitev cron + čakalne vrste? WMD nastavi cron sistem, razporejevalnik Laravel, Supervisor, Horizon in Healthchecks za odjemalce WP/Laravel. Stopite v stik z nami preko kontaktnega obrazca .