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));