Cannot send header after HTTP headers have been sent

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
stanley
Člen | 22
+
0
-

Ahoj,

na jednom starším Nette projektu (Nette version 2.0-dev 5bdf5b0 released on 2010–11–12) se potýkáme se zvláštním problémem. V presenteru se v metodě beforeRender volá metoda $this->getHttpResponse->setHeader(…). V 98% případů to vše funguje bez problémů, někdy se ale stane, že dojde k chybě „Cannot send header after HTTP headers have been sent“… – výstup údajně začal kdesi uvnitř šablony, kde nic zajímavého není (snad jedině to, že to většinou vyjde do nějakého JavaScriptu, ale to považuju za náhodu).

Není mi jasné, jak může dojít k nějakému výstupu v šabloně v metodě beforeRender. Díval jsem se na podobná témata na fóru a problém s BOM v tom není. Navíc se to dá jen velice špatně reprodukovat, protože to prakticky vždycky funguje a netušíme co je spouštěč. Dá se to „fixnout“ tím, že nastavím output_buffering PHP na nějakou vysokou hodnotu, ale to moc neřeší příčiny, jen následky, a má to svá negativa, ale máme vyzkoušeno že to pomáhá.

Setkal jste se s tím někdo? Díky.

CZechBoY
Člen | 3608
+
0
-

Ahoj,
v logu by se mělo ukázat na jakém přesně řádku začíná nějaký výstup a cesta povede do kešované šablony, nikoliv do templates/xxx/yyy.latte
Kontroloval si teda „kompilovanou“ šablonu nebo originál?

stanley
Člen | 22
+
0
-

Samozřejmě kompilovanou šablonu. Tam je směska HTML a <?php echo "…, takže čistě teoreticky tam je příležitostí k výstupu spousta, ale to je u zkompilovaných šablon běžné a problémy s tím nejsou (ob_start apod. postupy, které jsem teda detailně nezkoumal).

David Matějka
Moderator | 6445
+
0
-

Nekdy to zpusobuje startovani session ze sablony (treba vypisovani info o uzivateli nebo vykreslovani formu s addprotection). zkus zapnout startovani session automaticky, pripadne je startuj rucne v dotcenych presenterech

stanley
Člen | 22
+
0
-

To je zajímavé, ví se co je příčinou takového chování? Každopádně bych nerad startoval session úplně pro všechny uživatele, jelikož bych tím pohřbil cachování ve varnishi a většina uživatelů ani session k ničemu nepotřebuje… Ještě to ale prozkoumám, díky za tip.