Array an Funktion übergeben erzeugt Fatal Error beim Aufruf
Moin zusammen,
in einem PHP-Script habe ich ein zweidimensionales Array mit Daten, welche ich in einer Funktion auslesen und berechnen will. Innerhalb der Funktion wird die Funktion rekursiv noch einmal aufgerufen. Bei diesem Aufruf wird ein Fatal Error ausgegeben:
der PHP-Code sieht so aus:
Laß ich mir per var_dump() das übergebene Array anzeigen, läuft das Script ohne Probleme durch (Ok, beim erstmaligen Aufruf werden jede Menge NULL Werte ausgegeben, aber das Script arbeitet ohne Fatal Error). Werden Werte über die POST-Variablen übergeben, läuft das Script auch problemlos und zeigt die berechneten Werte an.
Wieso läuft das Script mit var_dump() durch und läuft ohne auf den Hammer? Was kann ich machen, um den Fehlerzustand zu beheben?
Die PHP-Variable für die Größe des zugeordneten Speichers kann ich nicht verändern, da ist der Hoster der Seite vor.
Gruß J chem
in einem PHP-Script habe ich ein zweidimensionales Array mit Daten, welche ich in einer Funktion auslesen und berechnen will. Innerhalb der Funktion wird die Funktion rekursiv noch einmal aufgerufen. Bei diesem Aufruf wird ein Fatal Error ausgegeben:
Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 523800 bytes) in /webspace/.... on line 37
der PHP-Code sieht so aus:
<?php
$wdt = $_POST["abreite"];
$qrs = $_POST["aquer"];
$arrqrs = array(
$arr[10] = array(0.95,0.00,0.00),
$arr[20] = array(0.95,0.00,0.00),
$arr[30] = array(0.98,0.00,0.00),
$arr[40] = array(0.95,0.85,1.00),
$arr[50] = array(0.85,0.75,0.95),
$arr[60] = array(0.75,0.75,0.95),
$arr[70] = array(0.75,0.60,0.85),
$arr[80] = array(0.75,0.60,0.85)
);
$arr_w = $arr[$qrs];
$r_nrm = fmt_rim(get_rim($wdt, $qrs, $arr_w, 0));
$r_min = fmt_rim(get_rim($wdt, $qrs, $arr_w, 1));
$r_max = fmt_rim(get_rim($wdt, $qrs, $arr_w, 2));
function get_rim($w, $q, $s, $j)
{
$r = $s[$j];
#var_dump($r);
if ($r == 0)
{
$rim = get_rim($w, $q, $s, 0);
$t = round($w*$q/100);
if ($t >= 74)
{
if ($j == 1)
$rim = $rim - 0.5;
else
$rim = $rim + 0.5;
}
}
else
{
$rim = round($w*$r/12.7)/2;
}
return($rim);
}
function fmt_rim($w)
{
$x = intval($w,10);
if ($x != $w)
$x = $x + 0.5;
return($x);
}
?>
Laß ich mir per var_dump() das übergebene Array anzeigen, läuft das Script ohne Probleme durch (Ok, beim erstmaligen Aufruf werden jede Menge NULL Werte ausgegeben, aber das Script arbeitet ohne Fatal Error). Werden Werte über die POST-Variablen übergeben, läuft das Script auch problemlos und zeigt die berechneten Werte an.
Wieso läuft das Script mit var_dump() durch und läuft ohne auf den Hammer? Was kann ich machen, um den Fehlerzustand zu beheben?
Die PHP-Variable für die Größe des zugeordneten Speichers kann ich nicht verändern, da ist der Hoster der Seite vor.
Gruß J chem
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 224308
Url: https://administrator.de/contentid/224308
Ausgedruckt am: 21.11.2024 um 21:11 Uhr
7 Kommentare
Neuester Kommentar
Moin
ich hab den Code jetzt nur eben kurz überflogen, aber erzeugt das hier:
nicht eine Endlos-Schleife falls die Bedingung $r==0 true ist? Das würde das vollaufen des Speichers erklären.
lg,
Slainte
ich hab den Code jetzt nur eben kurz überflogen, aber erzeugt das hier:
$r_nrm = fmt_rim(get_rim($wdt, $qrs, $arr_w, 0));
...
function get_rim($w, $q, $s, $j)
{
$r = $s[$j];
#var_dump($r);
if ($r == 0)
{
$rim = get_rim($w, $q, $s, 0);
...
lg,
Slainte
"Fatal error: Maximum function nesting level of '100' reached, aborting!"
... ja
.. könnte natürlich sein das dies beabsichtigt ist - dann müsste das Max Nesting Level erhöht werden.
weiterhin:
... unbedingt mal den Ablauf nachverfolgen und auch die Parameter prüfen.
... ja
error_reporting(E_ALL);
ini_set("display_errors", 1);
weiterhin:
Notice: Undefined index: abreite in ... on line 8 - $wdt = $_POST["abreite"];
Notice: Undefined index: aquer in ... on line 9 - $qrs = $_POST["aquer"];
Notice: Undefined index: in ... on line 22 - $arr_w = $arr[$qrs];
könnte natürlich sein das dies beabsichtigt ist - dann müsste das Max Nesting Level erhöht werden.
ne kann eigentl. nicht beabsichtigt sein.Die Funktion ist soweit ich das sehe deterministisch. Solange sich die Parameter $s und $j nicht ändern und $r einmal ==0 ist wird es das auch bleiben => endlosschleife.in dem Array ist der erste Wert immer ungleich 0, sodaß mit dem Zugriff
.. "$arr_w" ist aber nicht immer ein Array - es kann auch NULL sein. .. wenn "$qrs" nicht gesetzt ist. "$qrs" muss aber "10","20",..., oder "80" sein. Sonnst wird später bei "$r = $s[$j]" "$r" ebenfalls NULL und bei der Prüfung "if ($r == 0)" ist das Ergebniss TRUE ( denn NULL == 0 ist TRUE ) ... so und dann geht er in die selbe Funktion wieder rein mit "$s" und das selbe geht wieder los.Versuche mal
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
$wdt = 80085; //@$_POST["abreite"];
$qrs = 80; //@$_POST["aquer"];
$arrqrs = array(
$arr[10] = array(0.95,0.00,0.00),
$arr[20] = array(0.95,0.00,0.00),
$arr[30] = array(0.98,0.00,0.00),
$arr[40] = array(0.95,0.85,1.00),
$arr[50] = array(0.85,0.75,0.95),
$arr[60] = array(0.75,0.75,0.95),
$arr[70] = array(0.75,0.60,0.85),
$arr[80] = array(0.75,0.60,0.85),
);
#var_dump( $arrqrs );
#var_dump( $arr );
if (!isset($qrs) || !isset($arr[$qrs])) {
throw new Exception('invalid parameter for "aquer"');
} else
if (!isset($wdt) || !is_numeric($wdt)) {
throw new Exception('invalid parameter for "abreite"');
}
$arr_w = $arr[$qrs];
$r_nrm = fmt_rim(get_rim($wdt, $qrs, $arr_w, 0));
$r_min = fmt_rim(get_rim($wdt, $qrs, $arr_w, 1));
$r_max = fmt_rim(get_rim($wdt, $qrs, $arr_w, 2));
var_dump( array($r_nrm,$r_min,$r_max) );
exit;
function get_rim($w, $q, $s, $j) {
$r = $s[$j];
if ($r == 0) {
$rim = get_rim($w, $q, $s, 0);
$t = round($w*$q/100);
if ($t >= 74) {
if ($j == 1) $rim = $rim - 0.5;
else $rim = $rim + 0.5;
}
} else {
$rim = round($w*$r/12.7)/2;
}
return($rim);
}
function fmt_rim($w) {
$x = intval($w,10);
if ($x != $w) $x = $x + 0.5;
return($x);
}
PHP Version ?
var_dump(memory_get_usage() );
$arr = array( 2000000000 => 'Hallo Welt!', 0 => 'Hallo Welt!' );
var_dump(memory_get_usage() );
var_dump( $arr);
var_dump(memory_get_usage() );
exit;