DebugMode disabled – Nette\InvalidStateException: Cannot send session cache limiter – headers already sent
- Marek Bartoš
- Nette Blogger | 1275
Hlavičky se odesílají v okamžiku zaslání výstupu. Což se může
stát třeba i díky bílému znaku před <?php
. Měli byste
zjistit, kde se vám výstup předčasně odesílá, k tomu vám pomůže
Tracy\OutputDebugger.
Případný workaround je zapnout output buffering, ale je to jen side effect na
který není dobré se dlouhodobě spoléhat.
- svatekr
- Člen | 7
Začalo se mi to objevovat taky. Spustím-li stránku v Chrome (například) poprvé, skončí to na chybě „Cannot start session when headers already sent“. Stačí povolit Tracy i na produkci, F5 a pak Tracy zase vypnout a jede to normálně.
Jde jen o stránky, kde je vložena komponenta Ublaboo Grid.
Zkusil jsem OutputDebugger::enable(), ale nenašlo mi to nic podezřelého. Když jsem pak promazal Cache a znovu načetl stránku ve stejném prohlížeči, jede stránka normálně. Přegeneruje se Cache, všechno normální. Jakmile ale otevřu stránku v dalším profilu Chrome, ve kterém jsem zatím stránku neprohlížel, zase to končí na té chybě.
Po 3 dnech zkoumání mi pomohlo dát do configu řádek:
- Marek Bartoš
- Nette Blogger | 1275
Jakákoli stránka, která používá session ji musí spustit před odesláním výstupu (renderem šablony). Komponenta se může připojit až při renderu a do té doby neexistovat, takže pokud session k existenci potřebuje, vznikne tato chyba. Na fixnutí by ti mělo stačit spouštět session v beforeRender() metodě presenteru, není třeba ji zapínat všude.
OutputDebugger zdá se většinou nepomůže nikomu, protože není problém v brzkém výstupu, ale v pozdních hlavičkách (moje vysvětlení výš v threadu je tedy nedostatečné) :)
Konkrétně k datagridu – imho by vůbec nemusel vytvářet session pokud již neexistuje nebo pokud uživatel nechce uložit nějaký filtr. V prvním případě už vytváření session není třeba řešit a v tom druhém případě se komponenta vytvoří dostatečně brzy na to, aby mohla se session bezpečně pracovat :)
Editoval Mabar (12. 4. 2021 16:19)