CRON mit PHP?


#1

Bei unserem Webhoster kann ich CRON-Jobs nur über ein Panel eingeben und Dabei das Zeitintervall einstellen. Das funtktioniert für php-Scripte wunderbar.

Aber einen direkten Zugriff auf die Crontab oder eine Möglichkeit, shell-Scripte auszuführen habe ich nicht.

Bei vielen Open-Source-Programmen gibg es eine cron.php oder so was in der Art.

Gibt es eine Möglichkeit, das auch bei piwik umzusetzen oder was müßte ich tun ?

juergen


#2

Bei welchem Hoster bist du denn? Das Panel ist ja letztendlich nur eine Oberfläche für die crontab. Kannst du da explicit nur php Dateien angeben?

Ich richte die Cronjobs bei meinem Hoster auch über ein Panel ein. Dort kann ich allerdings die Datei frei wählen. Wichtig ist nur, dass man in der ersten Zeile der Datei angibt, “wer” die Datei ausführen soll. Im Falle des Piwik Cronjobs halt nicht PHP, sondern die Shell.

Kann der Provider das nicht auf Anfrage einrichten? Shellscripte sind ja nun nichts ungewöhnliches, wenn es um Cronjobs geht.


#3

ich bin bei all-inkl.com

Die Eingabemaske hab ich einmal angefügt - dort will er eine http.url, wahrscheinlich ist das das Problem.

Wenn ich das cron…sh direkt im Browser aufrufe, bitet er mir die Datei aus download an und wenn ich die Sachen im Panel eintrag kommt als Ergebnis (siehe unten) ebenfalls das Listing des Scripts.

Sieht so aus, dass ich da nicht auf shell umstellen kann - also Provider fragen ?!


#!/bin/sh -e # Description # This cron script will automatically run Piwik archiving every hour. # The script will also run scheduled tasks configured within piwik using # the event hook 'TaskScheduler.getScheduledTasks' # It automatically fetches the Super User token_auth # and triggers the archiving for all websites for all periods. # This ensures that all reports are pre-computed and Piwik renders very fast. # Documentation # Please check the documentation on http://piwik.org/docs/setup-auto-archiving/ # How to setup the crontab job? # Add the following lines in your crontab file, eg. /etc/cron.d/piwik-archive #---------------START CRON TAB-- #MAILTO="youremail@example.com" #5 * * * * www-data /path/to/piwik/misc/cron/archive.sh > /dev/null #-----------------END CRON TAB-- # When an error occurs (eg. php memory error, timeout) the error messages # will be sent to youremail@example.com. # # Optimization for high traffic websites # You may want to override the following settings in config/config.ini.php: # See documentation of the fields in your piwik/config/config.ini.php # # [General] # time_before_archive_considered_outdated = 3600 # enable_browser_archiving_triggering = false #=========================================================================== for TEST_PHP_BIN in php5 php php-cli php-cgi; do if which $TEST_PHP_BIN >/dev/null 2>/dev/null; then PHP_BIN=`which $TEST_PHP_BIN` break fi done if test -z $PHP_BIN; then echo "php binary not found. Make sure php5 or php exists in PATH." exit 1 fi act_path() { local pathname="$1" readlink -f "$pathname" 2>/dev/null || \ realpath "$pathname" 2>/dev/null || \ type -P "$pathname" 2>/dev/null } ARCHIVE=`act_path ${0}` PIWIK_CRON_FOLDER=`dirname ${ARCHIVE}` PIWIK_PATH="$PIWIK_CRON_FOLDER"/../../index.php PIWIK_CONFIG="$PIWIK_CRON_FOLDER"/../../config/config.ini.php PIWIK_SUPERUSER=`sed '/^\[superuser\]/,$!d;/^login[ \t]*=[ \t]*"*/!d;s///;s/"*[ \t]*$//;q' $PIWIK_CONFIG` PIWIK_SUPERUSER_MD5_PASSWORD=`sed '/^\[superuser\]/,$!d;/^password[ \t]*=[ \t]*"*/!d;s///;s/"*[ \t]*$//;q' $PIWIK_CONFIG` CMD_TOKEN_AUTH="$PHP_BIN -q $PIWIK_PATH -- module=API&method=UsersManager.getTokenAuth&userLogin=$PIWIK_SUPERUSER&md5Password=$PIWIK_SUPERUSER_MD5_PASSWORD&format=php&serialize=0" TOKEN_AUTH=`$CMD_TOKEN_AUTH` CMD_GET_ID_SITES="$PHP_BIN -q $PIWIK_PATH -- module=API&method=SitesManager.getAllSitesId&token_auth=$TOKEN_AUTH&format=csv&convertToUnicode=0" ID_SITES=`$CMD_GET_ID_SITES` CMD_GET_SEGMENTS_TO_ARCHIVE="$PHP_BIN -q $PIWIK_PATH -- module=API&method=CoreAdminHome.getKnownSegmentsToArchive&token_auth=$TOKEN_AUTH&format=csv&convertToUnicode=0" SEGMENTS_TO_ARCHIVE=`$CMD_GET_SEGMENTS_TO_ARCHIVE` echo "Starting Piwik reports archiving..." echo "" for idsite in $ID_SITES; do TEST_IS_NUMERIC=`echo $idsite | egrep '^[0-9]+$'` if test -n "$TEST_IS_NUMERIC"; then for period in day week month year; do echo "" echo "Archiving period = $period for idsite = $idsite..." CMD="$PHP_BIN -q $PIWIK_PATH -- module=API&method=VisitsSummary.getVisits&idSite=$idsite&period=$period&date=last52&format=xml&token_auth=$TOKEN_AUTH" $CMD for segment in $SEGMENTS_TO_ARCHIVE; do if test $segment != "value"; then echo "" echo " - Archiving for visitor segment $segment ..." CMD_ARCHIVE_SEGMENT="${CMD}&segment=$segment" $CMD_ARCHIVE_SEGMENT fi done done echo "" echo "Archiving for idsite = $idsite done!" fi done echo "Reports archiving finished." echo "---------------------------" echo "Starting Scheduled tasks..." echo "" CMD="$PHP_BIN -q $PIWIK_PATH -- module=API&method=CoreAdminHome.runScheduledTasks&format=csv&convertToUnicode=0&token_auth=$TOKEN_AUTH" $CMD echo "" echo "Finished Scheduled tasks." echo ""


#4

Mit “all-inkl.com” als Hoster habe ich leider keine Erfahrungen. Aber es wäre nicht das erste mal, dass ein Provider keine “richtigen” Cronjobs anbietet, sondern ein eigenes System nutzt. Ich würde dem Support einfach mal ne Mail schreiben, ob und wie du ein Shellscript als Cronjob einrichtest. Das werden die sicher nicht zum ersten mal gefragt :wink:


#5

und hier die Anwort vom Provider - geht leider nicht direkt :frowning:

diesen CronJob können wir nur auf einem eigenen Server direkt in die crontab eintragen. Bei Ihrem Tarif müssten Sie diese Zeilen mit einem PHP Skript via exec() ausführen und diesen dann als CronJob im KAS einrichten.


#6

Wundert mich, dass “exec()” zugelassen wird, aber soll ja nur recht sein. Das wäre dann in der Tat eine Möglichkeit. Sprich, du legst dir eine php Datei an, die dann dass ShellScript aufruft. In Manual von PHP finden sich entsprechende Beispiele -> PHP: exec - Manual


#7

Tja - war wohl doch nichts … exec scheint nur mit Einschränkungen zu gehen - so was kann er:

exec(“date”,$date, $int);
print ‘date :’.$date[0].“return value " .$int.”
";

Ergebnis
date :Tue Apr 12 11:37:12 CEST 2011return value 0

und bei anderen Befehlen kommt rc = 126 (was immer das heißt, wahrscheinlich nicht zulässig)

exec(“ls”, $dir, $return_var );
print ‘dir :’.$dir[0].“return value " .$return_var.”
";
print_r($dir);

Ergebnis
dir :return value 126
Array ( )


#8

Hab mich schon gewundert. Lassen keine Cronjobs zu, aber “exec()”. Ist aber auch ne Glanzleistung, dich darauf hinzuweisen, wenn “exec()” ohnehin eingeschränkt ist.

Ich fürchte, dass es da aktuell keine Lösung gibt. Es sei denn, jemand hat sich die archive.sh in PHP portiert.


#9

Hier die Lösung, habe es seit heute bei all-inkl.com so laufen:

  1. Dateirechte der Datei piwik/misc/cron/archive.sh auf 777 umstellen - muss ausführbar sein
  2. ein Verzeichnis (z.B. piwikcron) per FTP im root oder anderorts anlegen
  3. .htaccess Datei mit “AddHandler php5-cgi .php” (ohne Anführungszeichen) anlegen und ins Verzeichnis “piwikcron” per FTP kopieren
  4. im KAS unter “Tools” -> “Verzeichnisschutz” Benutzer und Passwort für das eben angelegte Verzeichnis “piwikcron” vergeben
  5. eine .phpx Datei mit nachfolgendem Inhalt erstellen und ebenfalls per FTP ins Verzeichnis “piwikcron” kopieren:

<?php
exec("php /www/htdocs/KUNDENNUMMER/PIWIKPFAD/misc/cron/archive.sh",$ausgabe,$rueckgabe);
if($rueckgabe === FALSE) {
	echo "<p>Der Archivierungsprozess wurde <strong>NICHT</strong> ausgeführt!</p>";}
else if ($rueckgabe == 0) {
	echo "<p>Der Archivierungsprozess wurde <strong>ERFOLGREICH</strong> ausgeführt!</p>";}

//Ausgabe optional, um den Rückgabewert und das ausgeführte Shellscript anzuzeigen - Hash-Zeichen für Nutzung entfernen
#echo "<p>Rückgabewert:&nbsp;".$rueckgabe."</p>";

#echo "<p>Shellscript:</p>";
#echo "<pre>";
#print_r($ausgabe);
#echo "</pre>";
?>

  1. im KAS unter “Tools” -> “Cronjobs” einen neuen Cronjob anlegen: Pfad zur .phpx Datei, Zeitpunkt festlegen z.B stündlich, HTTP Benutzer und Passwort aus dem Verzeichnisschutz eintragen und wenn man möchte eine E-Mail vergeben (Achtung bei der oben genannten Einstellung bekommt man stündlich eine E-Mail)
  2. in der Piwik Weboberfläche unter “Einstellungen” -> “Allgemeine Einstellungen” den ersten Radiobutton auf “Nein” setzen

So das war es, viel Erfolg!


#10

Hm, ich bin da an dem Thema auch dran.
Ich habe das alles nach der Anleitung von simon_77 eingerichtet.
Wenn ich nun aber im .phpx Script die auskommentierten Zeilen zur Ausgabe der Script-Rückmeldungen einkommentiere, sehe ich in der E-Mail die ich bekomme zwar eine Erfolgsmeldung. Aber da drunter wird dann der Script-Code von archive.sh angzeigt. Müsste da nicht der Script-Output von archive.sh stehen?

Ein Update der Daten in Piwik scheint auch nicht stattgefunden zu haben.

Hat sonst noch jemand Erfahrung mit dem Cronjob bei All-inkl oder die oben beschriebene Lösung erfolgreich zum laufen gebracht?

Viele Grüße!