[PHP] Error handling bij te weinig geheugen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb al op verscheidene plekken gezocht, maar ik kom er niet uit. Ik hoop dat jullie hier wel iets op weten.

Ik maak een pagina waar grote foto's geupload kunnen worden. Deze worden vervolgens verkleind. Als de foto erg groot is, klapt het script eruit met de volgende fout:

Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 9216 bytes)

Dat gebeurt op het moment dat de foto geopend wordt met imagecreatejpg.
Dus probeer ik die fout af te vangen, en wel als volgt:

PHP:
1
2
3
4
5
6
7
error_reporting(E_ALL); 
set_error_handler("handleError");

function handleError($errno, $errstr){
    echo("omijngod, een fout: $errno $errstr");
    exit();
}


Maar als de fout optreedt, lijkt hij niet afgevangen te worden. Terwijl als ik een andere fout afdwing, bijvoorbeeld
PHP:
1
$a = 25/0;

wordt hij wel keurig door handleError afgehandeld. Wat is hier aan de hand ?? Ligt het eraan dat de error fatal is ofzo? Maar hoe kun je hem dan handlen? try..catch gaat niet, php versie is 4.3.2

Alvast dank,

Karrrl

Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 12:54
Ik denk dat je die niet kan afvangen. Als ik de docs door spit kom ik de volgende passage tegen:
code:
1
Fatal run-time errors. These indicate errors that can not be recovered from, such as a memory allocation problem. Execution of the script is halted.


Wat gebeurt er als je de code samples, errorhandler examples, gebruikt die in de docs staan?

[ Voor 20% gewijzigd door Sybr_E-N op 06-04-2005 21:18 ]


Acties:
  • 0 Henk 'm!

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04 10:28

JeRa

Authentic

Sowieso worden fatal errors niet standaard door de errorhandler afgevangen, zoals in de post hierboven wordt beschreven.

Er is wél een manier om de error op te vangen, en dat is door alle output via een functie te laten verlopen via output buffering functies en te scannen op foutmeldingen. Nadeel aan jouw foutmelding is dat er waarschijnlijk ook te weinig geheugen meer is om een error fatsoenlijk af te handelen :P

[ Voor 4% gewijzigd door JeRa op 06-04-2005 23:23 ]

ifconfig eth0 down


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

JeRa: Output buffering is hier geen oplossing lijkt me. Fatal errors stoppen het script direct, dus er is geen mogelijkheid meer om iets te bewerken aan de output buffer. Het zal dus simpelweg geen effect hebben; niet omdat er te weinig geheugen zou zijn (16MB is niks ;)) maar gewoon omdat het een fatal error is. :)

'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!

  • magnifor
  • Registratie: Februari 2004
  • Niet online
Hier staat hoe je die error kan fixen:

http://www.tech-recipes.com/php_programming_tips777.html

:)

Acties:
  • 0 Henk 'm!

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04 10:28

JeRa

Authentic

-NMe- schreef op woensdag 06 april 2005 @ 23:25:
Fatal errors stoppen het script direct, dus er is geen mogelijkheid meer om iets te bewerken aan de output buffer.
Dan is het toch vreemd dat mijn methode perfect werkt ;)

De truuk ligt 'm in het verwerken van functies in externe bestanden. Fatal errors die daar optreden worden gemeld, maar alvorens het script te doden wordt doodleuk nog de custom handler voor output buffering aangeroepen :) fatal errors in het hoofdscript zullen inderdaad de boel laten stoppen voordat ob werkt, en daarom heb ik de basecode (pluginbased) en de errorhandlers zo duidelijk en errorfree mogelijk gehouden :) (je zou toch maar een error genereren vanuit je error handler :p)

Ik zou graag antwoorden op de vraag of dat ook met OOM-situaties werkt, maar om één of andere reden krijg ik PHP niet out of memory :+ je zou zeggen dat die 10 MB die ik heb toegewezen zo vol zit met een paar imagecreatetruecolor's :{

[edit]
Om de één of andere reden kan ik de limiet van 10 MB overschrijden :{ bovendien blijkt nu dat niet alle fatal errors mooi worden opgevangen, die één is kennelijk fataler dan de ander :)

[ Voor 10% gewijzigd door JeRa op 07-04-2005 00:31 ]

ifconfig eth0 down


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@magnifor: Thanks, ik had niet gedacht dat het zou werken, niet mijn server, dus ik dacht dat niet te kunnen bepalen. Wel dus, relaxed.

Maar ik vind het (als php noob) wel raar dat fatale fouten überhaupt bestaan. Fouten moet je kunnen afvangen . .

Bedankt,

Karel

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Verwijderd schreef op donderdag 07 april 2005 @ 09:58:
@magnifor: Thanks, ik had niet gedacht dat het zou werken, niet mijn server, dus ik dacht dat niet te kunnen bepalen. Wel dus, relaxed.

Maar ik vind het (als php noob) wel raar dat fatale fouten überhaupt bestaan. Fouten moet je kunnen afvangen . .

Bedankt,

Karel
Sommige fouten kun je niet afvangen; bijvoorbeeld compile fouten. En met het geheugen: vol is vol...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
maar de php engine is dan schijnbaar wel in staat de foutmelding uit te braken, het is niet zo dat ie helemaal niks meer doet. In plaats van het braken kan hij toch ook het foutief gealloceerde geheugen weer vrijgeven en een fatale error raisen die wel af te vangen is.
In andere talen is het in elk geval wel te doen..

Karrrl

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Verwijderd schreef op donderdag 07 april 2005 @ 10:30:
maar de php engine is dan schijnbaar wel in staat de foutmelding uit te braken, het is niet zo dat ie helemaal niks meer doet. In plaats van het braken kan hij toch ook het foutief gealloceerde geheugen weer vrijgeven en een fatale error raisen die wel af te vangen is.
In andere talen is het in elk geval wel te doen..

Karrrl
Als je gealloceerde werkgeheugen op is, dan is je alloceerde werkgeheugen op. Als jij PHP vertelt dat het 16MB mag gebruiken voor het werken met plaatjes, en PHP wil 17MB alloceren, dan kan het script niet doen wat jij ervan verlangt, en stopt het gewoon. Er is wel nog geheugen, het is alleen niet beschikbaar om met plaatjes te werken. Wil je dat wel kunnen, dan moet je de beschikbare hoeveelheid geheugen, zoals je weet, in php.ini groter maken.

Ik vind het zelf vrij logisch dat je hier een fatal error voor krijgt eigenlijk. :)

'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!

  • Sappie
  • Registratie: September 2000
  • Laatst online: 15:31

Sappie

De Parasitaire Capaciteit!

Heb je in php (volgens mij wel vanaf versie 5) geen exception handling wat je daarvoor zou kunnen gebruiken?

edit:
stom.. daar had je natuurlijk ook al aan gedacht, maar je hebt slechts de beschikking over php 4.3.2.. niet goed genoeg gelezen :O

[ Voor 66% gewijzigd door Sappie op 07-04-2005 12:40 ]

Specs | Audioscrobbler

Pagina: 1