[PHP] bug? dezelfde functie aanroepen in een functie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 30-08 11:55
Ik kwam toevallig achter de volgende bug (?) in PHP. ik vroeg mij of ik nou een echte bug gevonden heb of dat dit 'normaal' is.

PHP:
1
2
3
4
5
6
7
8
9
<?

function convertHTML($val) {

        return convertHTML($val);
}

echo "ditwerktniet:". convertHTML('bladiebla');
?>


de reden waarom ik dit uitvoerde was omdat ik een nogal stomme fout maakte bij een search & replace actie in een bestand. return convertHTML($val); hoort eigenlijk htmlentities($val, ENT_QUOTES); te zijn.

als je dit uitvoert op een webserver krijg je een 'this page cannot be displayed' van apache voorgeschoteld

en in de error_log van httpd komt het volgende voor:
code:
1
[Thu Nov 06 11:13:13 2003] [notice] child pid 14661 exit signal Segmentation fault (11)


is dit zo'n foute programmeur fout of is dit een bug?

Acties:
  • 0 Henk 'm!

Verwijderd

Bij een recursieve functie (de eigen functie binnen de functie aanroepen) heb je altijd een soort 'exit-if' nodig. Wat er nu gebeurt: de functie vraagt zichzelf aan, die op zijn beurt weer zichzelf aanvraagt, enz enz.. waardoor de functie natuurlijk nooit correct word uitgevoerd.

[ Voor 4% gewijzigd door Verwijderd op 06-11-2003 11:22 . Reden: typo ]


Acties:
  • 0 Henk 'm!

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 30-08 11:55
maar zou je dan geen timeout moeten krijgen van php, of zou php dan niet meteen moeten exitten?

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
twiekert schreef op 06 november 2003 @ 11:14:
is dit zo'n foute programmeur fout of is dit een bug?
In die code is het jouw fout. Maar recursieve functies zijn er express. Heel handig bij bepaalde sorteermethodes (MergeSort bijvoorbeeld), je kan de in een methode steeds het probleem 1 stapje verder verwerken bijvoorbeeld. Wel is het dan belangrijk dat je in een recursieve functie ook een test hebt zitten of je op een speciaal geval uit komt danwel de laatste state van jouw probleem. (zodat de laatst aangeroepte functie een waarde returnt, en niet oneindig verder gaat)

Er zijn zelfs een aantal actieve topics over recursie, oa: [rml][ php] recursieve functie werkend, efficient?[/rml]

[ Voor 18% gewijzigd door Voutloos op 06-11-2003 11:28 ]

{signature}


Acties:
  • 0 Henk 'm!

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 30-08 11:55
klopt, ik heb pas nog een tree gemaakt in php. Ik vindt het alleen vaag dat apache direct eruit klapt met een segmentation fault ipv een een php error.

Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:28

Robtimus

me Robtimus no like you

Het is ook geen programmeerfout, syntactisch gezien (semantisch natuurlijk wel).

Als je dit doet in bv Java dan compiled het ook goed. Voer je het uit krijg je een StackOverflowError of OutOfMemoryError. De JVM houdt het dan voor gezien.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 30-08 11:55
dit werkt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$i = 0;
function convertHTML($val) {
$exit = false;
global $i;
        
        if ($i === 10) {     
                $exit = true;
        }
        
        $i++;
        
        if (!$exit) {
                return convertHTML($val);
        }
 
}

echo "ditwerktniet:". convertHTML('bladiebla');
?>


dit werkt niet :?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?

$i = 0;
function convertHTML($val) {
$exit = false;
global $i;
        
        if ($i === 10000) {  
                $exit = true;
        }
        
        $i++;
        
        if (!$exit) {
                return convertHTML($val);
        }
 
}

echo "ditwerktniet:". convertHTML('bladiebla');
?>


is dit een geheugen probleem icm een bug in php? lijkt mij sterk eigenlijk, dit draait op een p4 2.4 & 1GB DDR op linux. geen geheugen tekort om ff 10.000 keer een loopje te doen toch ?
Het is ook geen programmeerfout, syntactisch gezien (semantisch natuurlijk wel).

Als je dit doet in bv Java dan compiled het ook goed. Voer je het uit krijg je een StackOverflowError of OutOfMemoryError. De JVM houdt het dan voor gezien.
dat is nou precies mijn punt, je krijgt helemaal geen foutmelding op het scherm :?

[ Voor 29% gewijzigd door twiekert op 06-11-2003 12:47 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Het is meer dan 10000 keer 'een loopje doen'. Hij reserveert 10000 keer plaats in het geheugen waarmee de functie uitgevoerd word. Misschien moet je je eens wat meer gaan verdiepen in recursieve functies...

Acties:
  • 0 Henk 'm!

  • igmar
  • Registratie: April 2000
  • Laatst online: 03-09 22:58

igmar

ISO20022

twiekert schreef op 06 november 2003 @ 11:14:
Ik kwam toevallig achter de volgende bug (?) in PHP. ik vroeg mij of ik nou een echte bug gevonden heb of dat dit 'normaal' is.
<snip recursive functies aanroepen verhaaltje>

Kort en krachtig : Een 'bug', en bekend probleem, en nee, het gaat in PHP 4 iig niet opgelost worden.

Acties:
  • 0 Henk 'm!

  • igmar
  • Registratie: April 2000
  • Laatst online: 03-09 22:58

igmar

ISO20022

twiekert schreef op 06 november 2003 @ 12:26:
is dit een geheugen probleem icm een bug in php? lijkt mij sterk eigenlijk, dit draait op een p4 2.4 & 1GB DDR op linux. geen geheugen tekort om ff 10.000 keer een loopje te doen toch ?
PHP zet scripts om naar opcodes, en die zetten hun data op een stack. Die stack heeft een beperkte grootte, en als je recursief functies blijft aanroepen loopt die stack over.

Acties:
  • 0 Henk 'm!

Verwijderd

twiekert schreef op 06 november 2003 @ 11:25:
maar zou je dan geen timeout moeten krijgen van php, of zou php dan niet meteen moeten exitten?
Die timeout krijg je nu toch van je webserver?

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 16:51
Verwijderd schreef op 06 november 2003 @ 13:29:
[...]

Die timeout krijg je nu toch van je webserver?
Dat denk ik niet, het is toch een PHP error, en je stelt het toch ook in php.ini in?

Natuurlijk komt de melding wel VIA de webserver voor de miereneukers ;)

Acties:
  • 0 Henk 'm!

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 30-08 11:55
okee ik snap het, je krijgt dus een 'stack overload'. maar hoe groot is deze stack dan en waar is deze in te stellen (en kan dat zoiezowel)? als je dus een megagrote tree hebt gemaakt met 10K+ nodes erin en je loopt deze recursief door dan gaat dat dus met php 4 niet werken ?

is dit in PHP5 wel geregeld of is dit een limitatie van PHP of moet je daar dan omheen programmeren als je met zo'n groot aantal nodes aan het werk bent ?
Pagina: 1