Home > CRM, Open Source, php > vTiger und Cron-Jobs

vTiger und Cron-Jobs

Nach einer längeren Pause wegen hoher Arbeitslast, Kurzurlaub und Herzinfarkt melde ich mich zurück :-) . Mein Blog lebt also weiter. Ja so wie ich wohl auch :-)

Mein Thema heute sind die Cronjobs bei vTiger, mit denen ich gerade in einem meiner Kundenprojekte viel zu tun habe. In diesem Projekt werden die Daten einer wirklich komplexen Online-Registrierung zum Wechsel des Energieanbieters (realisiert mit Joomla und CommunityBuilder) automatisch in das CRM-System vTiger gepostet. In vTiger wird dann ein Großteil des gesamten Wechselprozesses inkl. der vollständigen Rechnungslegung abgebildet. Um dies weitgehend  vollautomatisch abzuwickeln, haben wir eine ganze Reihe von zeitlich abgestimmten Cron-Jobs gebaut. Das generelle Vorgehen zur Erzeugung eines solchen Jobs in vTiger möchte ich hier kurz skizzieren.

Definition : Cron-Job

Ein Programm/Ein Script auf dem Server, das in definierten Zeitabständen vom System automatisch gestartet wird.

Dieses Programm ist bei vTiger ein php-Script. D.h. das System muss so konfiguriert sein, dass man php-Scripts von der Kommandozeile starten kann. In der Regel ist das per default möglich.

Erzeugung eines neuen Cron-Jobs für vTiger

Auf dem Server im Installationsordner von vTiger findet sich nun ein Ordner namens “cron”. Dort ist fast alles zu finden, was man für einen solchen Job benötigt. Unter anderem einige mitgelieferte Jobs, die zum Lieferumfang gehören (z.B. um regelmässige Backups durchzuführen).

Und auch eine sehr nützliche Textdatei namens : “README-NewCronServiceSetup.txt”. Dort sind eigentlich fast alle Informationen (in englisch) enthalten, die man benötigt um einen eigenen Cronjob zu basteln. Im Einzelnen findet sich dort ein Code-Rahmen für jeden dieser Jobs und der beispielhafte Inhalt der Scripts zum Starten : ein Beispiel für Linux  und eines für Windows.

Hier der Inhalt dieser Datei:

To setup a new cron service

===========================

1. Create <ServiceName>.service file, which has the following content at the beginning

<?php

require_once(‘config.inc.php’);

/** Verify the script call is from trusted place. */
global $application_unique_key;
if($_REQUEST['app_key'] != $application_unique_key) {
echo “Access denied!”;
exit;
}

/**
* Check if instance of this service is already running?
*/
$svcname = $_REQUEST['service'];
// We need to make sure the PIDfile name is unqique
$servicePIDFile = “logs/$svcname-service.pid”;

if(file_exists($servicePIDFile)) {
echo “Service $svcname already running! Check $servicePIDFile”;
exit;
} else {
$servicePIDFp = fopen($servicePIDFile, ‘a’);
}

/**
* Turn-off PHP error reporting.
*/
try { error_reporting(0); } catch(Exception $e) { }

// … REST OF YOUR CODE …

// AT END
/** Close and remove the PID file. */
if($servicePIDFp) {
fclose($servicePIDFp);
unlink($servicePIDFile);
}

?>

=====================================================================================================================================

2. Create <ServiceName>Cron.sh file which should have the following:

export VTIGERCRM_ROOTDIR=`dirname “$0″`/..
export USE_PHP=php

cd $VTIGERCRM_ROOTDIR

$USE_PHP -f vtigercron.php service=”<ServiceName>” <param>=”<value>”

=====================================================================================================================================

3. Create <ServiceName>Cron.bat file which should have the following:

@echo off

set VTIGERCRM_ROOTDIR=”C:\Program Files\vtigercrm5\apache\htdocs\vtigerCRM”
set PHP_EXE=”C:\Program Files\vtigercrm5\php\php.exe”

cd /D %VTIGERCRM_ROOTDIR%

%PHP_EXE% -f vtigercron.php service=”<ServiceName>” <param>=”<value>”
=====================================================================================================================================

Schaut doch nicht so schwierig aus, oder ?

Den Code müsst ihr dann aber selbst schreiben … oder gebt uns den Auftrag … :-) :-)

Scherzchen :-)

Noch zu tun bzw einzustellen

1. Unseren neuen Job, respektive dessen Code in die Datei vtigercron.php inkludieren

Nehmen wir an, wir haben den Code unseres neuen Cron-Jobs in eine neue Datei “unserjob.service” im Ordner “cron/modules” erzeugt. Unser Service hat den Namen “unserjob”. Siehe Code-Rahmen oben.

Dann fügen wir in vtigercron.php folgende Zeilen ein:

/**
* Unser neuer Cron-Job
*/
if($service == ‘unserjob’) {
include_once(‘cron/modules/unserjob.service’);
}

Macht Sinn, oder ?

2) Einmalig Sicherheits-Key setzen

Dazu gibt es eine Datei namens config.cron.php unter <vtiger>/cron. Sie sieht so aus:

$VTIGER_CRON_CONFIGURATION = array(
/*
* Please refer to config.inc.php, copy the value of $application_unique_key here.
* Example:
* ‘app_key’ => ’4cad1980873495f4dfdd4bd8b1204cfc7′
*/

‘app_key’ => ’4cad1980873495f4dfdd4bd8b1204cfc7′

);

Stimmt dieser Eintrag nicht, bekommt man nur ein “Permission denied” beim Start unseres Jobs !!

3. Start und Testunseres neuen Jobs

Um unseren neuen Job zu testen, gehen wir in einem Cmdline-Fenster (Shell) in das Installations-Directory unserer vTiger-Installation auf dem Server und starten unseren Job dort so :

akejr@systemworx:/srv/www/htdocs/vtigercrm> php -f vtigercron.php service=unserjob

Schreiben wir php -f vtigercron.php service=unserjob -e >run.log werden alle Ausgaben (echos etc.) in run.log geschrieben. Zu Debugging-Zwecken ganz nützlich

Für Realbetrieb als echter Cronjob, gestartet vom System, eher ungeeignet. Dazu benötigen wir ein Logging-System, das ich weiter unten kurz beschreibe.

4. CronJob

Ich setze voraus, Sie wissen, wie ein Cronjob auf Ihrem System aufgesetzt wird ;-) .

Hier ein Beispiel, wie es z.B. der Befehl crontab -l auf einem Linux-System auflistet:

*/1     *       *       *       *       /srv/www/htdocs/vtigercrm/cron/modules/unserjob.sh

Ein Job der jede Minute läuft ;-) . Ja braucht man auch mal …..

Logging

vTiger hat ein Logging-System eingebaut, das es ermöglicht beliebige Ausgaben in dedizierte Log-Files zu schreiben. Hier kurz die notwendigen Infos um dieses System auch in Cronjobs zu nutzen:

1) Einschalten des Loggings (systemweit)

Die Zeile

$PERFORMANCE_CONFIG = Array(
// Enable log4php debugging only if requried
‘LOG4PHP_DEBUG’ => true,  // SX for testing

in der Datei <vtiger>/config.performance.php ändern.

2) Definition des Loggings

Wir nehmen wieder unseren Beispieljob “unserjob”.

Wir fügen ans Ende der Datei <vtiger>log4php.properties einen Block ein, der so aussieht:

log4php.logger.unserjob=DEBUG,A9
log4php.appender.A9=LoggerAppenderRollingFile
log4php.appender.A9.MaxFileSize=3MB
log4php.appender.A9.MaxBackupIndex=10
log4php.appender.A9.layout=LoggerLayoutTTCC
log4php.appender.A9.layout.ContextPrinting=”true”
log4php.appender.A9.layout.DateFormat=”%c”
log4php.appender.A9.File=logs/unserjob.log

Achtung : Dieses “A9“muss eindeutig in dieser Datei sein. Also wenn schon belegt, dann eine andere Bezeichnung nehmen. “DEBUG” ist das Logging-Level. Siehe nächsten Punkt.

3) Im Job einen Log-Eintrag schreiben

Am Anfang des Scripts/Jobs:

global $log; // auch in jeder function

$log =& LoggerManager::getLogger(unserjob’);

Beispiel einer Textausgabe für Logging-Level “DEBUG” :

$log->debug(“Wir sind hier vorbei gekommen”); // beliebig oft

Damit schreibt man zur Laufzeit Informationen in unser Log-File “logs/unserjob.log” (siehe oben).

Achtung : Die Log-Dateien werden als Write-Only erzeugt. Sind also nur als Nutzer ROOT lesbar !!

Abschlussbemerkung

So das soll es gewesen sein. Nicht gar so schwer oder ?

Jedenfalls hoffe ich dem einen oder anderen damit geholfen zu haben die ersten Hürden zu nehmen. Ist gar nicht so schwer, wenn man es mal gemacht hat.

  1. christian
    26. Oktober 2011, 20:14 | #1

    Hallo,
    erstmal gute Besserung _und_ ab sofort weniger < Stress!!! Der Blog soll ja schließlich noch länger leben!

    Cron Jobs sind immer eine sehr praktische und nette Sache. Die Tatsache, dass ich geplante Aufgaben zeitgesteuert ausführen kann, machen Cronjobs zu einem unverzichtbaren Werkzeug. Der Artikel hilft sicher vielen weiter, "die mal was automatisieren müssen"…

    Christian

  2. 26. Oktober 2011, 20:29 | #2

    Besten Dank, Christian :-) !!

  1. Bisher keine Trackbacks