Ergebnis 1 bis 5 von 5

Thema: Probleme mit Cron & Session

  1. #1
    Contao-Nutzer Avatar von a-v-l
    Registriert seit
    20.09.2013.
    Ort
    Freiburg im Breisgau
    Beiträge
    88

    Standard Probleme mit Cron & Session

    Ich arbeite gerade an einer Art Aboverlängerung mit automatisch generierten Bestellungen in Isotope: Wird ein Abo bestellt, wird das Enddatum (heute +ein Jahr) in ein Memberfeld geschrieben. Per Cron wird dann täglich geprüft, ob dieses Enddatum erreicht ist (und keine Kündigung eingegangen ist). Dann wird aus den Memberdaten und der ebenfalls dort gespeicherten Abo-Variante eine neue Bestellung erzeugt. Das funktioniert auch alles ganz gut.

    Leider bekomme ich beim manuellen Ausführen des Cron-Jobs aber überall, wo unset($_SESSION['XYZ']) steht einen Session-Fehler:
    Code:
    [2023-11-01T12:38:32.257866+00:00] app.ERROR: RuntimeException: Failed to start the session because headers have already been sent by "/Users/a-v-l/www/contao/vendor/symfony/var-dumper/Dumper/AbstractDumper.php" at line 174. in /Users/a-v-l/www/contao/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php:145 Stack trace:
    #0  /Users/a-v-l/www/contao/vendor/symfony/http-foundation/Session/Session.php(61): Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage->start()
    #1  /Users/a-v-l/www/contao/vendor/contao/core-bundle/src/Session/LazySessionAccess.php(97): Symfony\Component\HttpFoundation\Session\Session->start()
    #2  /Users/a-v-l/www/contao/vendor/contao/core-bundle/src/Session/LazySessionAccess.php(77): Contao\CoreBundle\Session\LazySessionAccess->startSession()
    
    // Hier steht unset($_SESSION['FILES']) – was dann wohl den Fehler auslöst
    #3  /Users/a-v-l/www/contao/vendor/isotope/isotope-core/system/modules/isotope/library/Isotope/Model/ProductCollection.php(1075): Contao\CoreBundle\Session\LazySessionAccess->offsetUnset('FILES')
    
    // Hier wird das Produkt zur Bestellung hinzugefügt:
    #4  /Users/a-v-l/www/contao/src/Cron/CronWorker.php(214): Isotope\Model\ProductCollection->addProduct(Object(Isotope\Model\Product\Standard), 1)
    #5  /Users/a-v-l/www/contao/src/Cron/CronWorker.php(103): App\Cron\CronWorker->renewAbo(Array)
    #6  /Users/a-v-l/www/contao/vendor/contao/core-bundle/src/Cron/CronJob.php(42): App\Cron\CronWorker->__invoke('web')
    #7  /Users/a-v-l/www/contao/vendor/contao/core-bundle/src/Cron/Cron.php(131): Contao\CoreBundle\Cron\CronJob->__invoke('web')
    #8  /Users/a-v-l/www/contao/vendor/contao/core-bundle/src/Controller/FrontendController.php(49): Contao\CoreBundle\Cron\Cron->run('web')
    #9  /Users/a-v-l/www/contao/vendor/symfony/http-kernel/HttpKernel.php(163): Contao\CoreBundle\Controller\FrontendController->cronAction(Object(Symfony\Component\HttpFoundation\Request))
    #10 /Users/a-v-l/www/contao/vendor/symfony/http-kernel/HttpKernel.php(75): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1)
    #11 /Users/a-v-l/www/contao/vendor/symfony/http-kernel/Kernel.php(202): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
    #12 /Users/a-v-l/www/contao/vendor/symfony/http-kernel/HttpCache/SubRequestHandler.php(86): Symfony\Component\HttpKernel\Kernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
    #13 /Users/a-v-l/www/contao/vendor/symfony/http-kernel/HttpCache/HttpCache.php(481): Symfony\Component\HttpKernel\HttpCache\SubRequestHandler::handle(Object(Contao\ManagerBundle\HttpKernel\ContaoKernel), Object(Symfony\Component\HttpFoundation\Request), 1, true)
    #14 /Users/a-v-l/www/contao/vendor/symfony/framework-bundle/HttpCache/HttpCache.php(73): Symfony\Component\HttpKernel\HttpCache\HttpCache->forward(Object(Symfony\Component\HttpFoundation\Request), true, NULL)
    #15 /Users/a-v-l/www/contao/vendor/symfony/http-kernel/HttpCache/HttpCache.php(454): Symfony\Bundle\FrameworkBundle\HttpCache\HttpCache->forward(Object(Symfony\Component\HttpFoundation\Request), true)
    #16 /Users/a-v-l/www/contao/vendor/contao/manager-bundle/src/HttpKernel/ContaoCache.php(66): Symfony\Component\HttpKernel\HttpCache\HttpCache->fetch(Object(Symfony\Component\HttpFoundation\Request), true)
    #17 /Users/a-v-l/www/contao/vendor/symfony/http-kernel/HttpCache/HttpCache.php(348): Contao\ManagerBundle\HttpKernel\ContaoCache->fetch(Object(Symfony\Component\HttpFoundation\Request), true)
    #18 /Users/a-v-l/www/contao/vendor/symfony/http-kernel/HttpCache/HttpCache.php(226): Symfony\Component\HttpKernel\HttpCache\HttpCache->lookup(Object(Symfony\Component\HttpFoundation\Request), true)
    #19 /Users/a-v-l/www/contao/vendor/friendsofsymfony/http-cache/src/SymfonyCache/EventDispatchingHttpCache.php(98): Symfony\Component\HttpKernel\HttpCache\HttpCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
    #20 /Users/a-v-l/www/contao/public/index.php(44): Contao\ManagerBundle\HttpKernel\ContaoCache->handle(Object(Symfony\Component\HttpFoundation\Request))
    #21 {main} [] []
    Z.B. ist das in system/modules/isotope/library/Isotope/Model/ProductCollection.php:1075 der Fall. Wenn ich die Zeile auskommentiere läuft alles gut durch. Aber das kann ja keine saubere Lösung sein!

    Hat jemand eine Idee?

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

    Standard

    Die Funktion ist wohl nicht dafür vorgesehen auf der Konsole ausgeführt zu werden. Ihr müsstet daher eine Alternative implementieren.
    » sponsor me via GitHub or PayPal or Revolut

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

    Standard

    Oder ihr macht einen PR, sodass dieses unset nur ausgeführt wird, wenn ein Request (und eine Session) vorhanden ist, damit die Funktion mit der CLI kompatibel wird.
    » sponsor me via GitHub or PayPal or Revolut

  4. #4
    Contao-Nutzer Avatar von a-v-l
    Registriert seit
    20.09.2013.
    Ort
    Freiburg im Breisgau
    Beiträge
    88

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Die Funktion ist wohl nicht dafür vorgesehen auf der Konsole ausgeführt zu werden. Ihr müsstet daher eine Alternative implementieren.
    Ja, Isotope stellt keine API zur Verfügung. Ich habe einige Workarounds einbauen müssen, um die Sache zum Laufen zu bringen. Z.B. wird ja immer geprüft, ob die Produkte überhaupt auf der aktuellen Seite zur Verfügung stehen. Das konnte ich faken, indem ich die entsprechende Seite als globale Variabel definiert habe:
    PHP-Code:
    $objPage = new PageModel();
    $GLOBALS['objPage'] = $objPage::findOneByAlias('abo'); // dort werden die Abos angeboten 
    Die Frage ist nun, ob ich das Problem mit der $_SESSION auch noch in den Griff bekomme. Ich kann ja schlecht fordern, dass sich jemand aus der Redaktion (ist ein Online-Magazin) jeden morgen 9:00 Uhr ins Backend einloggt und ein Knopf klickt um auslaufende Abos zu verlängern…

  5. #5
    Contao-Nutzer Avatar von a-v-l
    Registriert seit
    20.09.2013.
    Ort
    Freiburg im Breisgau
    Beiträge
    88

    Standard

    Zitat Zitat von a-v-l Beitrag anzeigen
    Die Frage ist nun, ob ich das Problem mit der $_SESSION auch noch in den Griff bekomme…
    Manchmal hilft lautes Nachdenken! Ich habe in meiner renewAbo-Methode einfach eine eigene Session gestartet:

    PHP-Code:
    new \Symfony\Component\HttpFoundation\Session\Session
    Funktioniert!

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
  •