Einen Cronjob-Teil schreiben
Diese Anleitung richtet sich an PHP-Entwickler, die Arbeit nach Zeitplan ausführen lassen müssen: abgelaufene
Datensätze bereinigen, eine Zusammenfassung versenden, einen Feed importieren. Ein Cronjob-Teil ist eine benannte Gruppe
von Skripten in cronjob.ini; die System-Crontab führt runcronjobs.php <part> aus, das jedes Skript des Teils
ausführt. Die Anwendungssicht auf dasselbe Thema finden Sie unter
Cronjobs für Anwendungen.
Inhalt
- Schritt 1: die Cronjob-Klasse
- Schritt 2: die Einstiegsdatei
- Schritt 3: der Teil in cronjob.ini
- Schritt 4: ausführen
- Schritt 5: zeitlich planen
- Was das Skript erhält
- Regeln für zeitlich geplanten Code
Schritt 1: die Cronjob-Klasse
extension/acmereport/classes/runnable/cronjobs/cleanup.php:
namespace Exponential\Cronjob\Extension\Acmereport;
class Cleanup extends \Exponential\Runnable\CronjobPart
{
public function run( array $scope )
{
$cli = $scope['cli'];
$removed = \acmeReportService::removeExpired( 500 ); // at most 500 per run
if ( empty( $scope['isQuiet'] ) )
$cli->output( "acmereport: removed $removed expired items" );
}
}Schritt 2: die Einstiegsdatei
extension/acmereport/cronjobs/cleanup.php:
/**
* @description Remove expired acmereport items
*/
return \Exponential\Cronjob\Extension\Acmereport\Cleanup::main( __FILE__, get_defined_vars() );list cron in der Konsole beschreibt jeden Teil mit den @description-Tags seiner Skripte.
Schritt 3: der Teil in cronjob.ini
extension/acmereport/settings/cronjob.ini.append.php:
[CronjobSettings]
ExtensionDirectories[]=acmereport
[CronjobPart-acmereport]
Scripts[]=cleanup.php
*/ ?>ExtensionDirectories[] lässt den Runner in extension/acmereport/cronjobs/ suchen. Sie können Ihr Skript auch einem
vorhandenen Teil hinzufügen ([CronjobPart-frequent] Scripts[]=cleanup.php) statt einem eigenen Teil; ein eigener Teil
lässt sich getrennt planen und getrennt pausieren.
Schritt 4: ausführen
php bin/php/ezpgenerateautoloads.php -e
php bin/php/ezcache.php --clear-tag=ini
php runcronjobs.php acmereport # the classic runner
php bin/php/console cron:acmereport # the same through the console
php bin/php/console list cron # every part and its scriptsFügen Sie -s <siteaccess> für die Einstellungen eines Siteaccess hinzu und --allow-root-user nur, wenn Sie als root
arbeiten müssen.
Schritt 5: zeitlich planen
Fügen Sie den Teil der Crontab des Site-Benutzers hinzu, neben den Standardteilen (frequent, infrequent,
contentjobs ...):
*/15 * * * * cd /path/to/exponential && php runcronjobs.php -q acmereportphp bin/php/console crontab:list gibt die Crontab aus, crontab:edit öffnet sie. Setup > Cronjobs zeigt die Teile
und wann sie zuletzt gelaufen sind (Cronjob-Konsole,
Filter für Cronjob-Teile, Cronjobs pausieren).
Was das Skript erhält
get_defined_vars() übergibt, was eZRunCronjobs::runScript() definiert:
In $scope | Enthält |
|---|---|
cli | eZCLI, das Terminal |
isQuiet | ob -q angegeben wurde |
Das Skript läuft im Prozess von runcronjobs.php, nachdem Siteaccess, Erweiterungen und Datenbank eingerichtet sind.
Alle Skripte eines Laufs teilen sich diesen Prozess: Ein fataler Fehler in einem stoppt die übrigen, und statischer
Zustand des einen ist für das nächste sichtbar.
Regeln für zeitlich geplanten Code
- Begrenzte Arbeit pro Lauf. Verarbeiten Sie höchstens eine feste Anzahl von Elementen und lassen Sie den nächsten Lauf weitermachen. Ein Lauf, der länger dauert als sein Intervall, überschneidet sich mit dem nächsten.
- Wiederholbar. Ein Lauf, der auf halbem Weg gestoppt hat, muss sich sicher erneut starten lassen: Markieren Sie Elemente unterwegs als erledigt, in kurzen Transaktionen.
- Still, sofern nicht gewünscht. Geben Sie mit
-qbei Erfolg nichts aus; Cron schickt jede Ausgabe per Mail an den Benutzer. - Logs, nicht Ausgabe, für das, was sich geändert hat.
eZLog::write( ..., 'acmereport.log' ). - Die Arbeit in einem Dienst. Der Cronjob-Teil, ein Konsolenbefehl und eine Schaltfläche in der Administration
können alle
acmeReportService::removeExpired()aufrufen (Modul-Views als Klassen). - Schwere Arbeit pro Element gehört eher in eine Warteschlange oder einen Content-Job als in einen langen Cronjob (Hintergrundarbeit: Warteschlangen, Cronjobs und Content-Jobs).
Verwandte Seiten
- Ein Cronjob-Skript schreiben (Anwendungsentwickler)
- Cronjob-Teile (Erweiterungsentwickler)
- Leitfaden zu Cronjobs
- Freie Dokumentation: diese Seite darf unter der GNU FDL 1.3 frei kopiert, übersetzt und verbessert werden.
Werden Sie Exponential-Partner
Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.