ugrás a tartalomhoz

PHP tartalom már kiküldve hiba egy olyan sorban, amelyikben nincs is output

janoszen · 2005. Aug. 17. (Sze), 18.43
Sziasztok!

A következö hibaüzenetet kapom:

Warning: Cannot modify header information - headers already sent in g:\projects\szdsz\web\modules\core\iohandler.php on line 359

Warning: Cannot modify header information - headers already sent by (output started at g:\projects\szdsz\web\modules\core\iohandler.php:359) in g:\projects\szdsz\web\modules\core\iohandler.php on line 395

Warning: Cannot modify header information - headers already sent by (output started at g:\projects\szdsz\web\modules\core\iohandler.php:359) in g:\projects\szdsz\web\modules\core\iohandler.php on line 396

Warning: Cannot modify header information - headers already sent by (output started at g:\projects\szdsz\web\modules\core\iohandler.php:359) in g:\projects\szdsz\web\modules\core\iohandler.php on line 397


Namost, a megjelölt sorban mindössze ennyi áll:

header("HTTP/1.1 " . $this->_status . " " . $this->_statuscodes[$this->_status]);
Hozzátenném, hogy ez a program legvégén fut le egy shutdown-függvényként regisztrált függvényben. Ha közvetlenül írom ki (nem az általam írt buffereléssel) semmi baj nincs vele.

Ha van öteletetek, ne habozzatok, mert kissé tanácstalan vagyok.

Üdv

ProClub
 
1

már küldtél ki headert

Anonymous · 2005. Aug. 17. (Sze), 19.08
A header-t csak akkor módosíthatod, ha még nem volt kiküldve. Headert küld ki ha pl.: cookie-t küldesz a felhasználónak (pl.: session_start()-al), vagy ha valamit kiiratsz echo-val. Megoldás lehet az ob_start() bufferelés, vagy a program átszervezése.

üdv.: Zsolt
2

Erre már gondoltam

janoszen · 2005. Aug. 17. (Sze), 19.14
Üdv!

Gondoltam, abból, hogy class-okban programozom, lejön, hogy azért RTFM és RTFW megvolt mielőtt kérdezek. :) A programban egy árva echo vagy kiírás sincs, mert ott még nem tartok. A fájlok elején, végén sincs fölös space v. ilyesmi.

A probléma sajnos ennél bonyolultabb. :)

ProClub
4

ob_start?

Anonymous · 2005. Aug. 17. (Sze), 19.17
egy ob_start() a kód elé nem segít?
6

Nem. :(

janoszen · 2005. Aug. 17. (Sze), 19.31
Nem segít, mert az az általam írott flush függvény, ami tartalmat írna ki, a program futás legvége után fut le (register_shutdown_function segítségével). Ha jól veszem észre, a PHP már előtte flush-olja az output buffereket. Tehát a hiba nem szűnik meg.
3

output started at

Hojtsy Gábor · 2005. Aug. 17. (Sze), 19.16
Minden benne van a hibaüzenetben. Ott virít, hogy az SZDSZ projektedben az iohandler.php 359. sorában már küldtél kimenetet, ami után fejlécet nem tudsz. Ez egy annyira jellemző hiba, hogy csak a weblaboron egy csomó találatod lenne rá, szélesebb körű keresőkben meg végképp. Talán ezt érdemes lett volna megnézni előtte.
5

Mondom, hogy nem ilyen egyszerű

janoszen · 2005. Aug. 17. (Sze), 19.25
Üdv!

Köszönöm, de a probléma nem ilyen egyszerű. Mint a hibaüzenet jelzi az iohandler.php fájban a 359. sorban kezdőtött a kiírás. Viszont ebben egy árva header hívás van, ami, ha jól tudom, nem okoz ilyet.

Ha nem a teljes program futása után fut le (shutdown függvényként) a flush nevü függvény, amelyben a fent említett sor van, akkor semmi gond nincs az egésszel. Ha viszont shutdown-fv-ként fut le, előlép a hiba. Minden fájlt 6x leelenőriztem, sehol egy árva fölös szóköz, sortörés, BOM karakter, echo, print, print_r vagy hasonlóak.

Még egy HTTP fejléc-nézegetővel is megnéztem, mit ír ki!

ProClub
7

ja, flush()?

Hojtsy Gábor · 2005. Aug. 17. (Sze), 19.46
Hát talán valami innovatívabb függvény nevet kellene választani, nem a flush()-t, amit ha meghív, nem csodálkozhatsz, ha az output buffereket kiküldi.
8

Megjelölt sor???

T.G · 2005. Aug. 18. (Cs), 00.02
Gondoltam, abból, hogy class-okban programozom, lejön, hogy azért RTFM és RTFW megvolt mielőtt kérdezek...
ohhh... anyám... ez igen... remélem nem esett rád a plafon, miközben e remek mondatot megfogalmaztad.

Meg nem tudnám mondani miért, de egy ilyen mondat után, az is eszembe jutna, hogy figyelmetlenségből a 359. és a 395. sort kevered. Az utóbbiban valóban headert adsz ki, de az elősben??? Az jó, hogy odaírod, hogy megjelölt sor, de itt négy megjelölt sor van, vagyis lenne... nem csak egy...
10

A pontosság kedvéért

janoszen · 2005. Aug. 18. (Cs), 09.51
A pontosság kedvéért hozzáteszem, hogy mind a 4 sorban header() hívás van.
9

Nem az én hibám, PHP bug

janoszen · 2005. Aug. 18. (Cs), 09.22
Üdv mindenkinek!

Mielött mindenki elkezd engem elküldeni a valahová, nem az én hibám a dolog, hanem egy PHP bug. (És nem, nem kevertem össze a 359. és a 395. sort. Mondom, hogy 6x átnéztem, mielött beküldtem volna.) Legalábbis nekem úgy tünik. Kisérleti PHP file:

<?php
 class bugtest
 {
  function bugtest()
  {
   register_shutdown_function(array(&$this, 'destructor'));
  }

  function destructor()
  {
   header("HTTP/1.1 200 OK");
  }
 }

 $bugtest = &new bugtest();
?>
És lássatok csodát, mit kapok?

Warning: Cannot modify header information - headers already sent in g:\...\bugtest.php on line 11


Szóval nem én voltam a hülye. Mindez a 4.4.0-s PHPra igaz. 5-össel nem próbáltam.

A második kisérletben még tovább redukáltam a kisérleti kódot - meghagytam a függvényt class nélkül és a register_shutdown_function hívást szimplán a függvényre. Miután ugyanez a hiba lépett fel, feltételezem, hogy a shutdown függvényekben a PHP valamilyen hibája következtében a header hívások ilyet produkálnak.

Üdv

ProClub
11

Mea culpa. :))))

T.G · 2005. Aug. 18. (Cs), 10.00
Az 5-nél is. :)

a hiba reprodulásához osztály sem szükséges...

<? register_shutdown_function(create_function('','header("...");'));
Gondolom a PHP fejlesztői nem gondolták, hogy van valaki, aki a shutdown függvények előtt nem küldött még ki semmit, így ők (valamiért?) kiküldték a headereket... Nézd meg a headers_sent -et, az alapján látod, hogy mikor a callback függvényedhez ér az futás, akkor már ki lett küldve az összes header.
12

headers_sent true

janoszen · 2005. Aug. 18. (Cs), 10.11
A headers_sent értéke true volt. Ez volt az elsö, amit megnéztem. A második kisérletben egyébként én is ilyen "rövidebb" kódot alkalmaztam. :) A bugreport címe:
http://bugs.php.net/bug.php?id=34181

Lehet szavazni. :)

ProClub
13

PHP bug report

janoszen · 2005. Aug. 18. (Cs), 10.20
A PHP bugreportban ez állt:

This behaviour was changed in 5.1, but it won't be changed in 4.4 & 5.0
for BC reasons.


Tehát csak az 5.1-esben javították ki. :)

ProClub