TYPO3 - Scheduler

Aus Wikizone
Version vom 1. Juni 2016, 14:28 Uhr von 149.172.227.142 (Diskussion) (→‎Funktionen für den Task anlegen)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Links[Bearbeiten]

Hinweis: Ab TYPO3 6 gibt es auch den CommandController.

Typo3 Command Line Interface (CLI) (normalerweise nicht mehr benötigt)

Scheduler in Extbase[Bearbeiten]

Todo

TypoScript Konfiguration in Scheduler nutzen[Bearbeiten]

1. Page ID ist nicht klar, daher nutzt man das Modul TypoScript:

Extbase Variante[Bearbeiten]

Das direkte erzeugen des ConfigurationManager über makeInstance funktioniert nicht: dependency injections are only done by the ObjectManager and not by the makeInstance call. The ConfigurationManager needs the EnvironmentService now (what is resolved by DI). Deshalb folgendes vorgehen in der Scheduler Klasse:

		// get settings
		$objectManager = 
		GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Object\\ObjectManager');
		$configurationManager = $objectManager->get('TYPO3\\CMS\\Extbase\\Configuration\\ConfigurationManager');
		$this->settings = $configurationManager->getConfiguration(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_SETTINGS,'myext');
		debug($this->settings,"settings");

TypoScript (auf der Rootpage)

module.tx_myext {
  settings{
    importFile = http://localhost/www/typo3_test_v6/fileadmin/user_upload/rma/rma.csv
  }
}

Wichtig der Unterschlüssel Settings.

Scheduler Cronjob[Bearbeiten]

Siehe auch Linux - Cronjobs

Quickstart[Bearbeiten]

  • Scheduler im TYPO3 installieren falls noch nicht aktiv
  • User _cli_scheduler ohne besondere Rechte im TYPO3 Backend anlegen
  • entweder Cronjob über Shell anlegen mit Scheduler aufruf (s.u.)
  • oder bei Zugriff nur über php exec Funktion nutzen Beispiel all-inkl:
  • Geschützter Ordner /cron/ anlegen
  • scheduler.phpx anlegen (s.u.)
  • über Administration Cronjob anlegen

Erläuterung[Bearbeiten]

Benötigt Backend User _cli_scheduler

Aufruf allgemein

/pfad/zu/php /pfad/zu/typo3/cli_dispatch.phpsh scheduler

z.B.

/usr/local/bin/php /home/bob/www/typo3/cli_dispatch.phpsh scheduler

auf Mac mit XAMPP

/Applications/XAMPP/xamppfiles/bin/php /Applications/XAMPP/xamppfiles/htdocs/typo3_test/typo3/cli_dispatch.phpsh scheduler

Beispiel aus der Praxis[Bearbeiten]

Welche php Version und wo liegt diese?[Bearbeiten]

Ein guter Startpunkt wäre auch einmal phpinfo(); über eine php Datei im Browser aufzurufen.

Dann gehts auf dem Server weiter:

Der einzurichtende Befehl ist ein PHP-Script. Wir müssen herausfinden wo sich unsere php.exe/php/php5-Datei befindet. Unter Linux/Unix kann dieser Befehl helfen:

which php

oder eben

which php5

Das Ergebnis sieht ungefähr so aus:

/usr/bin/php

Wo liegt TYPO3[Bearbeiten]

für den Scheduler muß man die Datei cli_dispatch.phpsg mit dem Parameter scheduler aufrufen. Sie liegt in der Source. Du kannst sie z.B. mit

find

in der Linux Konsole finden. In unserem Beispiel finden wir sie hier:

/var/www/narda-sts/htdocs/typo3_src/typo3/cli_dipatch.phpsh

Cronjob einrichten[Bearbeiten]

Du kannst auch zuerst mal den Befehl über die Shell direkt eingeben um zu schauen ob im Typo alles ordentlich ausgeführt wird. Also im Beispiel:

/usr/bin/php /var/www/narda-sts/htdocs/typo3_src/typo3/cli_dipatch.phpsh scheduler

Vorhandene Cronjobs anschauen:

crontab -l

Cronjob hinzufügen

crontab -e

Dieser Befehl öffnet die Crontabelle mit dem Systemeditor. So erstellt man für den aktuellen Benutzer Cronjobs. Ich würde hier empfehlen, diesen Cronjob für den www-user einzurichten.

Z.B. alle 15min

*/15 * * * * /usr/bin/php /var/www/narda-sts/htdocs/typo3_src/typo3/cli_dipatch.phpsh scheduler

Hier seht Ihr auch endlich warum wir den php-Pfad benötigten.

Testtasks[Bearbeiten]

Die Extension scheduler bringt zwei Test-Tasks mit. Zum Testen müssen wir nun im Backend unter "Planer" per Selectbox auf "Geplante Tasks" wechseln. Hier können wir nun mit "Task hinzufügen" einen neuen Task erstellen. Alle Tasks haben mindestens folgende Settings:

Deaktivieren: Haken rein und der Task ist deaktiviert.

Klasse: Hier könnt Ihr auswählen, welchen Task Ihr einrichten wollt.

Typ: Soll der Task nur einmal zu einem bestimmten Termin oder "wiederkehrend" an Hand eines Intervalls gestartet werden.

Start/Stop/Häufigkeit: Je nach Typ erscheinen diese Felder, die eigentlich selbsterklärend sein sollten.

ALLE Felder, die ich hier nicht aufgelistet sind, gehören zum Task selbst. So gibt es bei dem einen Task ein zusätzliches E-Mail-Feld, weil Dieser mit jeder Ausführung eine E-Mail sendet und der Schlafen-Task hat ein eigenes Feld für wie lange er schlafen soll. Auch in unserer Extension werde ich zeigen, wie Ihr eigene Felder Eurem Task hinzufügen könnt.

Nach einem Klick auf Speichern landet Ihr wieder bei der Auflistung in der Euer erstellter Tasks nun auch erscheinen sollte.

Scheduler über Skript statt direkt aufrufen[Bearbeiten]

Todo Siehe Weiland

Scheduler Cronjob auf all Inkl Servern[Bearbeiten]

  • Datei mit Endung .phpx anlegen. Am besten in ein Verzeichnis mit Namen /cronjobs oder /tasks o.ä. Das Skript muß für php ausführbar sein.
  • Eventuell Verzeichnis schützen (über kasserver mit htaccess Schutz).
  • Die enthaltene exec Funktion muß den absoluten Pfad zum Skript bekommen.

Beispiel:

cron/scheduler.phpx

<?php
    exec("php /www/htdocs/w00c43b9/typo3/cli_dispatch.phpsh scheduler",$ausgabe);
    echo "<pre>";
    print_r($ausgabe);
    echo "

";

?>

Scheduler in eigener Extension[Bearbeiten]

Beispiel gbimporter

Der gbimporter importiert per Cronjob entfernte .csv Dateien und liest sie in die TYPO3 Datenbank ein. Die benötigten Daten legt man als Datensatz im Backend an. Die Extension ist folgendermaßen aufgebaut.

Damit wir den Scheduler nutzen können müssen wir Folgendes tun:

Scheduler Task in der ext_localconf.php registrieren[Bearbeiten]

...
## Scheduler Aufgabe anmelden (ab Version 4.3)
$TYPO3_CONF_VARS['SC_OPTIONS']['scheduler']['tasks']['tx_gbimporter_import'] = array(
	'extension' => $_EXTKEY, // Extension Key ;-)
	'title' => 'GB Importer', // Der Titel der Aufgabe
	'description' => 'Importieren von CSV Daten per Cronjob', // Die Beschreibung der Aufgabe
	// 'additionalFields' => 'tx_extkey_TaskName_AdditionalFieldProvider' // Zusätzliche Felder
);
...

Somit weiß TYPO3 daß es einen task tx_gbimporter_import geben soll der über den Scheduler ausgeführt werden darf, und wie es den Task im Backend anzeigen muß. Über die additionalFields könnte man zusätzliche Felder im Backend anzeigen die man für weitere Einstellungen nutzen könnte (siehe weiterführende Links)

Scheduler Task über ext_autoload.php laden[Bearbeiten]

Damit TYPO3 nun noch weiß was es bei Aufruf der Aufgabe tx_gbimporter_import tun soll brauchen wir eine passende Klasse die den auszuführenden php Code enthält. Diese laden wir einfach über den autoload Mechanismus: Enthält eine Extension die Datei ext_autoload.php, wird diese automatisch beim initialisieren der Extension ausgeführt. Daher können wir in dieser Datei die Klasse class.tx_gbimporter_import laden:

ext_autoload.php

<?php
return array(
    'tx_gbimporter_import' => t3lib_extMgm::extPath('gbimporter', 'tasks/class.tx_gbimporter_import.php')
);
?>

Wie man sieht können wir hier auf den Code der Klasse referenzieren. Diese müssen wir nun natürlich noch anlegen.

Funktionen für den Task anlegen[Bearbeiten]

Wie im vorherigen Schritt angegeben legen wir die Datei

task/class.tx_gbimporter_import.php 

an. Diese erweitert die TYPO3 Klasse

tx_scheduler_Task 

und enthält mindestens die Funktion execute(), die beim Start des Tasks aufgerufen wird. Damit der Scheduler entscheiden kann ob der Cronjob funktioniert hat, muß die Funktion true oder false zurückgeben

class.tx_gbimporter_import.php

<?php
class tx_gbimporter_import extends tx_scheduler_Task {
	
	public function execute() {
		$this->init();
		foreach($this->arrConfigData as $configKey=>$arrConfig){
			$this->configUid = $arrConfig['uid'];
                        ...			
                        if($this->getRemoteFile(...)){
				// delete old Data on this Page
				$this->deleteOldData(...);
				// insert new Data on this Page
				$this->insertNewData(...);
				return true;
			}else{
				return false;
			}

		}	
	}
        ...
}
?>

Messages aus dem Task ins Backend

http://stackoverflow.com/questions/19005221/typo3-scheduler-handling-exceptions (Zugriff 2016-06)

Beispiel:

public function importCommand($filetype) {

    try {

        if(!$this->isValidFileTypeConfigured($filetype)) {
            throw new \TYPO3\MbxRealestate\Helper\Exception\ImportImmoException('Unsupported filetype "' . $filetype . '" configured in ' . __CLASS__ . '::' . __FUNCTION__);
        }

       ....

    } catch (\Exception $ex) {

        throw $ex; // throwing ...
        return $ex; // or returning 
    }

    return true;
}