Skip to main content
Cron joby běží mimo HTTP request — jsou orchestrované systémovým cronem, který volá cron.php?key=<secret> v pravidelných intervalech.

Architektura

crontab (system)

   └─> wget / curl https://dayzero.cz/portal/cron.php?key=<secret>


                          cron.php (PHP entry)

                                    ├── ověří klíč
                                    ├── získá .cron.lock (file lock proti dvojímu běhu)

                                    └── JobRunner::runDue()

                                            └── pro každý due job: JobInterface::execute()

JobInterface

namespace App\Core\Scheduler;

interface JobInterface {
    public function getName(): string;
    public function shouldRun(): bool;
    public function execute(bool $dryRun = false): void;
}

Vestavěné joby

JobFrekvenceÚčel
AchievementCheckJobhodinověKontrola a udělování achievementů
RelayIngestJobkaždých 5 minSklízí NDJSON relay logy z DayZ serveru
AdmIngestJobhodinověSklízí .ADM legacy logy
WhitelistSyncJobdenněExport schválených Steam ID na herní server
PaymentCheckJobkaždých 30 minFIO Bank API → kontrola příchozích plateb
UserRemovalJobdenněFyzické smazání účtů po grace period
LogRetentionJobtýdněMazání logů starších než 30 dní

cron.php

GET /portal/cron.php?key=<cron_secret>
Odpověď je plain text se shrnutím (pro debug a monitoring):
[2025-05-01 04:00:01] Lock acquired
[2025-05-01 04:00:01] AchievementCheckJob: 12 grants, took 1.2s
[2025-05-01 04:00:02] PaymentCheckJob: 0 new payments
[2025-05-01 04:00:02] Lock released

Lock

Soubor .cron.lock v rootu portálu drží exkluzivní zámek (PHP flock()). Pokud běží jiná instance, druhá ihned skončí (žádné čekání).

Manuální spuštění konkrétního jobu

GET /portal/cron.php?key=<secret>&job=RelayIngestJob
Volitelně &dry_run=1.

Logování

  • logs/cron.log — denní výstup runneru
  • logs/cron.error.log — výjimky a fatal errors
Core/CronLogger.php se postará o formát.

Crontab příklad

*/5 * * * * curl -s "https://dayzero.cz/portal/cron.php?key=<secret>" >> /home/.../cron.out 2>&1
Frekvence v crontabu je 5 minut. Joby se vyhodnocují interně podle vlastní shouldRun() (např. denní job se spustí jen 1× denně).

Přidání nového jobu

1

Vytvořte třídu v src/Core/Scheduler/Jobs/

Implementujte JobInterface.
2

Zaregistrujte v JobRegistry

Singleton, který drží seznam všech jobů.
3

Otestujte přes ?job=...&dry_run=1

Bezpečně si ověřte chování.
4

Nasaďte do produkce

Spuštění už řeší runDue() — žádný další zásah do crontabu nepotřebujete.