DebugMode disabled – Nette\InvalidStateException: Cannot send session cache limiter – headers already sent

Failips
Člen | 54
+
0
-

Ahoj,

v našom systéme sa v poslednej dobe objavuje táto chyba:

Nette\InvalidStateException: Cannot send session cache limiter - headers already sent in ../vendor/nette/http/src/Http/Session.php:90

Jediné čo na ňu dočasne zaberie je zapnutie debug módu, ten ale chceme mať vypnutý. Nepomáha ani zmazanie cache.

Máte nejaké rady ako to odstrániť permanentne? Ďakujem

Marek Bartoš
Nette Blogger | 1143
+
+1
-

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.

Failips
Člen | 54
+
0
-

Mohol by si mi prosím bližšie popísať ako to pomocou Tracy\OutputDebugger odhaliť a zároveň ako to urobiť bez toho aby si ostatní užívatelia systému čokoľvek všimli?

Failips
Člen | 54
+
0
-

Všimol som si, že sa táto chyba vyskytuje na stránkach ktoré v sebe majú {control someControl}, kde someGrid je Ublaboo Datagrid alebo nejaky Form. Tam kde to nieje tak sa táto chyba neprejavuje.

Editoval Failips (12. 12. 2019 8:35)

Mysteria
Člen | 797
+
+1
-

Po index.php hodíš za autoload composeru Tracy\OutputDebugger::enable(); a nahoře na stránce se ti objeví seznam, kde co aplikace vypisovala.
Pokud to chceš jenom pro sebe, tak si to budeš muset vypodmínkovat třeba podle IP adresy nebo cookie.

svatekr
Člen | 7
+
+3
-

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:

session:
	autoStart: true
Marek Bartoš
Nette Blogger | 1143
+
0
-

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)