[PHP5/GD] Achtergrond zwart na starten sessie

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Hoi,

Ik loop tegen een vreemd probleem aan, waar ik niet helemaal uitkom. Het betreft een website die gemigreerd is naar een nieuwe server, waar ik zeer beperkte toegang toe heb. Het probleem is dat de achtergrond van jpegs die ik met GD maak opeens zwart worden. Na eindeloos debuggen heb ik het probleem gevonden. Ik heb gedebugd met de volgende testcode:

PHP:
1
2
3
4
5
6
$im = imagecreatetruecolor(120, 20);
imagefill($im, 0, 0, imagecolorallocate($im, 255,255,255));
header('Content-type: image/jpeg');
imagejpeg($im);
imagedestroy($im);
die();


Dit zou dus een wit plaatje moeten genereren. Op het moment dat ik deze code aanroep voor session_start() dan gaat het goed, als ik het erna aanroep dan gaat het fout en wordt het plaatje zwart. Sessies gebruik ik voor het opslaan van variabelen voor het tekenen van het plaatje (grafiekjes), en zijn gevuld met een flinke array, maar niks bijzonders voor zover ik kan nagaan. Op de oude server treedt dit probleem niet op, maar omdat ik alleen FTP-toegang tot de servers heb kan ik niet goed nagaan wat de verschillen zijn.

Wat verder nog gek is, is dat dit probleem alleen optreed met imagefill, tekenen met bijv imagefilledrectangle geeft wel de goede kleuren.

Heeft iemand enig idee wat hier aan de hand is?

Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
correctie: het lijkt te maken te hebben met de kleur wit: Als ik 254, 254, 254 invul ipv 255, 255, 255 dan werkt het wel. Vreemd... iemand een idee?

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Maakt het iets uit of je het naar een bestand of naar de browser schrijft?
En maakt de volgorde van de content-type header en de session_start() iets uit?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
drm schreef op zaterdag 14 februari 2009 @ 18:24:
Maakt het iets uit of je het naar een bestand of naar de browser schrijft?
nee
En maakt de volgorde van de content-type header en de session_start() iets uit?
ja! het gaat goed zolang ik de content-type header maar uitstuur voor session_start! Maar... wat betekent dat?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dat de headers die session_start zet spul door de war gooien en je dus beter éérst je Content-type header kan zetten? ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Yes, dat vermoeden had ik ook NMe :) Wegens mn framework is het lastig om de volgorde zomaar om te gooien en bovendien werkt het op al mn andere servers wel.

Mijn vraag is dan: Wat kan session_start() qua headers door de war gooien? En dan wel op zo'n manier dat het plaatje prima zichtbaar blijft alleen dat imagefill met 255,255,255 niet meer werkt?

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Dan moet er dus een verschil zijn in headers die de session_start() stuurt op de ene server en al die andere. Ben wel benieuwd welke headers dat dan precies zijn, want 't verbaast mij ook wel een beetje.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Bitage
  • Registratie: April 2006
  • Laatst online: 19-05-2024
Als het voor de achtergrond is, waarom gebruik je dan niet gewoon
PHP:
1
ImageColorAllocate($im,255,255,255);


Werkt dat wel?

Verbindt anders eens met Putty ofzo naar je webserver en bekijk de headers eens.

Acties:
  • 0 Henk 'm!

  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

Waarschijnlijk staat output buffering op de ene server standaard aan en op de andere niet.

edit@laaaat : beetje meer verklaring: waardoor PHP dus z'n "kan sessie-cookie-niet-meer-zetten-omdat-headers-al-verstuurd-zijn-error" vrolijk naar de output gooit waardoor je JPG corrupted en onvoorspelbaar wordt.

[ Voor 54% gewijzigd door Erik Jan op 15-02-2009 02:43 ]

This can no longer be ignored.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Erik Jan schreef op zondag 15 februari 2009 @ 01:05:
Waarschijnlijk staat output buffering op de ene server standaard aan en op de andere niet.
Dat zou inderdaad een en ander verklaren ja. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Bitage schreef op zondag 15 februari 2009 @ 00:51:
Als het voor de achtergrond is, waarom gebruik je dan niet gewoon
PHP:
1
ImageColorAllocate($im,255,255,255);


Werkt dat wel?

Verbindt anders eens met Putty ofzo naar je webserver en bekijk de headers eens.
En wat is dat anders dan de TS dat doet? (behalve lelijke camelcasing in php functie?

PHP:
1
imagecolorallocate($im, 255,255,255)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Cartman! schreef op zondag 15 februari 2009 @ 02:06:
[...]

En wat is dat anders dan de TS dat doet? (behalve lelijke camelcasing in php functie?
offtopic:
Lelijk? PHP zou just wat meer aan camelcasing moeten doen. :+

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Warm, warm mensen. Bij het maken van een PNG-tje krijg ik de volgende foutmelding:
2: Cannot modify header information - headers already sent by (output started at /session_manager/session_manager.php:39) in /output_handler/output_handler.php on line 349.
  • Die /session_manager.php:39 is session_start();
  • output_handler.php:349 zijn de normale headers die de template-engine uitstuurt.
Vreemd is wel dat ik deze foutmelding niet bij andere docbuilders (scriptjes voor het uitpoepen van files) krijg, maar het is wel een teken aan de wand. Als ik even logisch denk lijkt me dat ie direct de session_id uitstuurt als cookie, lijkt me de enige verklaarbare header waar session_start() mee te maken heeft.

Kom er alleen niet achter welke header ie nou echt uitzendt, ik heb direct na de session_start() een die() gegeven, maar de headers zien er nog compleet uit. Denk dat apache dat doet, want ook als ik een die() voor de session_start() geef, blijven die headers compleet.

Voor wie er chocola van kan maken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Date: Sun, 15 Feb 2009 08:58:56 GMT
Server: Apache
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding,User-Agent
Content-Encoding: gzip
Content-Length: 20
Keep-Alive: timeout=1, max=100
Connection: Keep-Alive
Content-Type: text/html

200 OK


Hoe kom ik erachter welke headers session_start() geeft, en belangrijker: hoe zorg ik dat ie zn grote mond houdt? ;)

[ Voor 5% gewijzigd door xilent_xage op 15-02-2009 10:16 ]


Acties:
  • 0 Henk 'm!

  • Bitage
  • Registratie: April 2006
  • Laatst online: 19-05-2024
Cartman! schreef op zondag 15 februari 2009 @ 02:06:
[...]

En wat is dat anders dan de TS dat doet? (behalve lelijke camelcasing in php functie?

PHP:
1
imagecolorallocate($im, 255,255,255)
Heel simpel: in het script van de TS wordt er alleen een kleur gedefiniëerd om te gebruiken in de ImageFill functie, terwijl de ImageColorAllocate functie op zich al is om een achtergrond te maken, ook al kun je later nog steeds aparte kleuren ermee definiëren. Je hebt dus helemaal geen ImageFill nodig, maar slechts één keer die ImageColorAllocate voor je achtergrond. Gebruik de functies dus gewoon waar ze voor zijn.
NMe schreef op zondag 15 februari 2009 @ 05:18:
[...]

offtopic:
Lelijk? PHP zou just wat meer aan camelcasing moeten doen. :+
offtopic:
+1

[ Voor 12% gewijzigd door Bitage op 15-02-2009 11:39 ]


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 16:42

DataGhost

iPL dev

Bitage schreef op zondag 15 februari 2009 @ 11:36:
[...]

de ImageColorAllocate functie op zich al is om een achtergrond te maken [...] Je hebt dus helemaal geen ImageFill nodig
Eh, niet met een truecolor-image. Alleen bij palette-based images gebeurt dat.

Acties:
  • 0 Henk 'm!

  • Bitage
  • Registratie: April 2006
  • Laatst online: 19-05-2024
DataGhost schreef op zondag 15 februari 2009 @ 11:44:
[...]

Eh, niet met een truecolor-image. Alleen bij palette-based images gebeurt dat.
My bad, ik gebruik GD dan ook meer om statistieken en dergelijk mee weer te geven, daar heb je nooit echt truecolors nodig. Had dus even niet goed opgelet :X

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Verwarrend idd dat t bij het ene type image wel en de ander niet zo is dan ja want dat wist ik niet, ik gebruik ook alleen maar truecolor ;)

en offtopic doorgaan: camelcasing prima voor de functies maar als t dan maar consequent is ipv. weer functies met underscores :|

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
xilent_xage schreef op zondag 15 februari 2009 @ 10:07:
...de volgende foutmelding:
2: Cannot modify header information - headers already sent by (output started at /session_manager/session_manager.php:39) in /output_handler/output_handler.php on line 349.
Dit is de meest voorkomende PHP foutmelding, en is tevens de eenvoudigst te debuggen fout... Er staat gewoon letterlijk waar een header geset wordt en waar de output reeds begonnen was. :>

{signature}


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Voutloos schreef op zondag 15 februari 2009 @ 12:46:
[...]
Dit is de meest voorkomende PHP foutmelding, en is tevens de eenvoudigst te debuggen fout... Er staat gewoon letterlijk waar een header geset wordt en waar de output reeds begonnen was. :>
Zulks is mij bekend. Mijn vraag is: Hoe achterhaal ik welke header session_start() blijkbaar uitstuurt, en hoe voorkom ik dat ie die header uitstuurt?

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Doe eerst een die() voor de session_start() en daarna een die() na de session_start() en bekijk het verschil?

Hint: een browser als Firefox met addons als Firebug of livehttpheaders is hierbij wel handig. ;)

[ Voor 31% gewijzigd door Voutloos op 15-02-2009 12:53 ]

{signature}


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Voutloos schreef op zondag 15 februari 2009 @ 12:51:
Doe eerst een die() voor de session_start() en daarna een die() na de session_start() en bekijk het verschil?

Hint: een browser als Firefox met addons als Firebug of livehttpheaders is hierbij wel handig. ;)
No offense, maar zoals vermeld heb ik dit al geprobeerd. Check mijn eerdere posts...

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

xilent_xage schreef op zondag 15 februari 2009 @ 12:48:
[...]


Zulks is mij bekend. Mijn vraag is: Hoe achterhaal ik welke header session_start() blijkbaar uitstuurt, en hoe voorkom ik dat ie die header uitstuurt?
Hij stuurt alle headers uit op die regel. Je hebt daar gewoon uitvoer staan, mogelijk een witregel buiten de PHP-tags of gewoon domweg een echo. Dat, of je verstuurt op die regel expliciet de headers, maar dat zal het wel niet zijn. :)

Hier staat trouwens ook een stukje over in onze FAQ. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Sh4wn
  • Registratie: December 2006
  • Laatst online: 12-11-2017

Sh4wn

Bio-informatica

http://wiki.phpfreakz.nl/Headers_Already_Sent

Goed artikel over headers already sent. :)

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Met de functie get_headers kun je overigens keurig achterhalen welke headers er al gezet zijn ;)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waarin niks gezegd wordt wat niet al voorbij is gekomen in dit topic bedoel je? :P

Het verbaast me overigens dat dat artikel gewoon lijkt te kloppen. Wordt PFZ dan toch eindelijk volwassen? :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1