Ergebnis 1 bis 6 von 6

Thema: Cron / Funktion wird nie ausgeführt

  1. #1
    Contao-Nutzer
    Registriert seit
    24.02.2010.
    Beiträge
    64

    Standard Cron / Funktion wird nie ausgeführt

    Hallo alle,

    ich versuch eine selbst gebaute Backendfunktion, die schon länger in Betrieb ist, per daily cron aufrufen zu lassen.
    Während sie als Backend-Modul funktioniert, wird sie im Cron nicht ausgeführt.
    Was sagt ihr, wo wäre der beste Debug-Punkt? (Die Contao-Version hier ist 3.5 LTS.)

    Setup in Kürze:
    PHP-Code:
    // system/modules/mymod/config/config.php
    $GLOBALS['BE_MOD']['content']['mymod'] = array(
            
    'tables' => array('tl_mymod1','tl_mymod2'),
    );
    $GLOBALS['BE_MOD']['content']['mymod']['refresh'] = array(
            
    'MyClass',
            
    'refreshTable'
    );
    $GLOBALS['TL_CRON']['daily'][]  = array(
            
    'MyClass',
            
    'refreshTable'
    );

    // system/modules/mymod/classes/MyClass.php
    class MyClass extends System {
    ...
    public function 
    refreshTable(\Contao\DC_Table $dc) {
            
    $this->log('HERE WE GO'__CLASS__.'::'.__FUNCTION__TL_CRON);
    }
    ...

    Aus dem Backend kann ich die Funktion über einen (DCA spar ich euch und mir) Button starten.
    Sie loggt dann, supi, "HERE WE GO".

    Beim Cron-Lauf (bei mir extern, also über Crontab gestartet) macht sie nichts und loggt auch
    nichts.

    Cron sieht sie und versucht sie auszuführen (ich lasse cron.php loggen, was es vorhat):

    PHP-Code:
    // system/cron/cron.php
    ...
    // Run the jobs
    foreach ($arrIntervals as $strInterval)
    {
       ...
       
    $this->log('Running the ' $strInterval ' cron jobs'__METHOD__TL_CRON);
       foreach (
    $GLOBALS['TL_CRON'][$strInterval] as $callback)
       {
    // log to see what is actually done / flx 02.2016
    $this->log('Cronjob detail: '.$strInterval.','.$callback[0].','.$callback[1],__METHOD__TL_CRON);
            
    $this->import($callback[0]);
            
    $this->$callback[0]->$callback[1]();
       }
       
    $this->log(ucfirst($strInterval) . ' cron jobs complete'__METHOD__TL_CRON);
    ...

    callback[0..1] werden aufgerufen, aber das Ende der Schleife (Log: "cron jobs complete") wird nie erreicht.
    (vgl. Contao-Log)
    PHP-Code:
    [2016-02-11 23:45Cronjob detaildaily,MyClass,refreshTable    Löschen Anzeigen
    [2016-02-11 23:45Checked for Contao updates    Löschen Anzeigen
    [2016-02-11 23:45Cronjob detaildaily,Automator,checkForUpdates    Löschen Anzeigen
    [2016-02-11 23:45Purged the temp folder    Löschen Anzeigen
    [2016-02-11 23:45Cronjob detaildaily,Automator,purgeTempFolder    Löschen Anzeigen
    [2016-02-11 23:45Cronjob detaildaily,Automator,rotateLogs    Löschen Anzeigen
    [2016-02-11 23:45Running the daily cron jobs 
    Könnt ihr mir helfen? Wo soll ich den Fehler suchen? Der Logbefehl steht ganz am Anfang von refreshTable, wird
    aber nie erreicht. Ich seh nix

    Danke & Grüße
    flx.

  2. #2
    Maintainer Avatar von xtra
    Registriert seit
    02.07.2009.
    Ort
    Tuebingen
    Beiträge
    2.007
    User beschenken
    Wunschliste

    Standard

    Schau dir doch mal den Code genau an:
    PHP-Code:
    public function refreshTable(\Contao\DC_Table $dc) {
    // ...

    Du willst einen DC_Table bekommen, den gibt dir der Cron aber nicht, woher soll er ihn auch zaubern.

    Ich koennte wetten dass du in deiner system/logs/error.log schoene Fehlermeldungen des Cron findest, dass da ein recoverable und ein Fatal Error auftritt, oder gar Exceptions.
    Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

  3. #3
    Contao-Nutzer
    Registriert seit
    24.02.2010.
    Beiträge
    64

    Standard

    Erklär mal genauer! Hat das Contao (-Subsystem?), das am Anfang von cron.php aufgerufen wird:
    define('TL_MODE', 'FE');
    require '../initialize.php';
    nicht Zugang zu denselben Ressourcen wie das Backend (also z.B. DC_Table)?

    Im Errorlog steht kein passender Fehler (nix rund um die Uhrzeit des dailycron).

    Bitte entschuldige, wenn ich erst in 1 Woche antworte, ich fahr gleich in Urlaub

    flx.

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.121
    Partner-ID
    10107

    Standard

    Zitat Zitat von flx Beitrag anzeigen
    Erklär mal genauer! Hat das Contao (-Subsystem?), das am Anfang von cron.php aufgerufen wird:
    define('TL_MODE', 'FE');
    require '../initialize.php';
    nicht Zugang zu denselben Ressourcen wie das Backend (also z.B. DC_Table)?
    Hm, du verwechselst hier irgend etwas. Jedenfalls ruft der Cron die Callbacks so auf: system/modules/core/controllers/FrontendCron.php#L100, also ohne Parameter.

  5. #5
    Contao-Nutzer
    Registriert seit
    24.02.2010.
    Beiträge
    64

    Standard

    Zitat Zitat von xtra Beitrag anzeigen
    Schau dir doch mal den Code genau an:
    PHP-Code:
    public function refreshTable(\Contao\DC_Table $dc) {
    // ...

    Du willst einen DC_Table bekommen, den gibt dir der Cron aber nicht, woher soll er ihn auch zaubern.
    Treffer, xtra (auch wenn meine error.log schweigt).

    Ich schreib nochmal ausführlich auf, damit es für die Nachwelt erhalten bleibt:

    Meine Funktion wird normalerweise über einen Button aufgerufen, den ich im DCA definiert habe. Diese Definition sieht z.B. so aus (in meiner Frage hatte ich das unterschlagen

    PHP-Code:
    $GLOBALS['TL_DCA']['tl_mymod1'] = array(
    ...
      
    'operations'        => array(
        
    'refresh'       => array(
          
    'label' => 'Refresh',
          
    'href'  => 'key=refresh',
          
    'icon'  => ...
        ),
      )
    ), 
    Dieser Backend-Button produziert, wie zu erwarten, den Link

    contao/main.php?do=mymod&key=refresh
    und der ruft MyClass->refreshTable mit einem Argument vom Typ DC_Table auf.

    Das Argument kann ich ignorieren, ich ändere die Argumentliste zu ():

    public function refreshTable() {
    ...
    }

    Jetzt kann cron.php die Funktion auch aufrufen. Das klappt, weil PHP nicht meckert, wenn eine
    Funktion zuviele Argumente erhält (es meckert nur, wenn Argumente _fehlen_).

    Funzt! Danke euch beiden!
    flx.

  6. #6
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.513
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von flx Beitrag anzeigen
    (es meckert nur, wenn Argumente _fehlen_).
    wenn du beides möchtest, ginge auch das:
    PHP-Code:
    public function refreshTable($dc false) {
    // ...

    Dann ist $dc = false wenn kein Parameter kommt, und gefülllt mit dem Inhalt wenn ein Parameter bei ist. (z.B. durch den Button per DCA)
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •