PHP Scripts als Cronjob betreiben

PHP-Scripts im Browser aufzurufen und als Cronjob zu betreiben sind zwei verschiedene Paar Schuhe.
Im CLI-Modus gibt es kein HTTP, keine Session, keine $_GET-Parameter und andere Timeouts.

Einfachster Weg: php-cli direkt aufrufen

* * * * * /usr/bin/php /var/www/meinprojekt/cron/cleanup.php >> /var/log/cron-cleanup.log 2>&1

Absoluter Pfad zu php und zum Script, Ausgabe ins Log umleiten.

Im Script auf CLI-Ausführung prüfen

if (php_sapi_name() !== 'cli') {
    exit('Nur als CLI aufrufbar.');
}

Verhindert dass das Script versehentlich über den Browser aufgerufen werden kann.

Arbeitsverzeichnis setzen

Das Arbeitsverzeichnis ist beim Cron-Aufruf oft nicht das Projektverzeichnis.
Relative Pfade funktionieren dann nicht. Am Anfang des Scripts explizit setzen.

chdir(__DIR__);

Oder gleich alle Pfade relativ zu __DIR__ aufbauen.

Autoloader und Config einbinden

<?php
if (php_sapi_name() !== 'cli') { exit; }

chdir(__DIR__ . '/../');
require_once 'config/config.php';
require_once 'core/Database.php';

Ausgabe und Laufzeit

Im CLI gibt es kein Output-Buffering, echo schreibt direkt.
Das Standard-Timeout von 30 Sekunden gilt im CLI nicht, Scripts laufen so lange wie sie wollen.
Für Scripts die lange laufen trotzdem ein eigenes Timeout setzen.

set_time_limit(300); // 5 Minuten als Sicherheitsnetz

Mehrere gleichzeitige Ausführungen verhindern

$lockfile = '/tmp/mein-script.lock';

if (file_exists($lockfile)) {
    exit('Script läuft bereits.');
}

file_put_contents($lockfile, getmypid());
register_shutdown_function(fn() => @unlink($lockfile));