TYPO3 - Scheduler: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
Zeile 1: Zeile 1:
 
== Links ==
 
== Links ==
 +
Hinweis: Ab TYPO3 6 gibt es auch den CommandController.
  
 
[[Typo3 Command Line Interface (CLI)]]
 
[[Typo3 Command Line Interface (CLI)]]

Version vom 13. August 2015, 20:49 Uhr

Links

Hinweis: Ab TYPO3 6 gibt es auch den CommandController.

Typo3 Command Line Interface (CLI)

Scheduler Cronjob

Quickstart

  • 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

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

Scheduler Cronjob auf all Inkl Servern

  • 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

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

...
## 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

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

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

		}	
	}
        ...
}
?>