Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Array an Funktion übergeben erzeugt Fatal Error beim Aufruf

Frage Entwicklung PHP

Mitglied: Jochem

Jochem (Level 2) - Jetzt verbinden

12.12.2013, aktualisiert 18:32 Uhr, 1481 Aufrufe, 7 Kommentare

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:
01.
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:

01.
<?php 
02.
 
03.
$wdt = $_POST["abreite"]; 
04.
$qrs = $_POST["aquer"]; 
05.
 
06.
$arrqrs = array( 
07.
$arr[10] = array(0.95,0.00,0.00), 
08.
$arr[20] = array(0.95,0.00,0.00), 
09.
$arr[30] = array(0.98,0.00,0.00), 
10.
$arr[40] = array(0.95,0.85,1.00), 
11.
$arr[50] = array(0.85,0.75,0.95), 
12.
$arr[60] = array(0.75,0.75,0.95), 
13.
$arr[70] = array(0.75,0.60,0.85), 
14.
$arr[80] = array(0.75,0.60,0.85) 
15.
); 
16.
 
17.
$arr_w = $arr[$qrs]; 
18.
 
19.
$r_nrm = fmt_rim(get_rim($wdt, $qrs, $arr_w, 0)); 
20.
$r_min = fmt_rim(get_rim($wdt, $qrs, $arr_w, 1)); 
21.
$r_max = fmt_rim(get_rim($wdt, $qrs, $arr_w, 2)); 
22.
 
23.
function get_rim($w, $q, $s, $j) 
24.
25.
 
26.
$r = $s[$j]; 
27.
#var_dump($r); 
28.
 
29.
	if ($r == 0) 
30.
31.
	    $rim = get_rim($w, $q, $s, 0); 
32.
	    $t = round($w*$q/100); 
33.
	    if ($t >= 74) 
34.
35.
			if ($j == 1) 
36.
				$rim = $rim - 0.5; 
37.
			else 
38.
				$rim = $rim + 0.5; 
39.
40.
41.
	else 
42.
43.
	    $rim = round($w*$r/12.7)/2; 
44.
45.
	 
46.
	return($rim); 
47.
48.
	 
49.
function fmt_rim($w) 
50.
51.
	$x = intval($w,10); 
52.
	if ($x != $w) 
53.
		$x = $x + 0.5; 
54.
	return($x); 
55.
56.
 
57.
 
58.
?>
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

Mitglied: SlainteMhath
LÖSUNG 12.12.2013, aktualisiert um 18:32 Uhr
Moin

ich hab den Code jetzt nur eben kurz überflogen, aber erzeugt das hier:
01.
$r_nrm = fmt_rim(get_rim($wdt, $qrs, $arr_w, 0));  
02.
... 
03.
function get_rim($w, $q, $s, $j)  
04.
{  
05.
  
06.
$r = $s[$j];  
07.
#var_dump($r);  
08.
 
09.
	if ($r == 0)  
10.
	{  
11.
	    $rim = get_rim($w, $q, $s, 0);  
12.
...
nicht eine Endlos-Schleife falls die Bedingung $r==0 true ist? Das würde das vollaufen des Speichers erklären.

lg,
Slainte
Bitte warten ..
Mitglied: nxclass
12.12.2013, aktualisiert um 10:43 Uhr
"Fatal error: Maximum function nesting level of '100' reached, aborting!"
... ja
01.
error_reporting(E_ALL); 
02.
ini_set("display_errors", 1);
.. könnte natürlich sein das dies beabsichtigt ist - dann müsste das Max Nesting Level erhöht werden.

weiterhin:
01.
Notice: Undefined index: abreite in ... on line 8 - $wdt = $_POST["abreite"]; 
02.
Notice: Undefined index: aquer in ... on line 9 - $qrs = $_POST["aquer"]; 
03.
Notice: Undefined index:  in ... on line 22 - $arr_w = $arr[$qrs];
... unbedingt mal den Ablauf nachverfolgen und auch die Parameter prüfen.
Bitte warten ..
Mitglied: SlainteMhath
12.12.2013 um 10:47 Uhr
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.
Bitte warten ..
Mitglied: Jochem
12.12.2013, aktualisiert um 11:37 Uhr
Moin,

in dem Array ist der erste Wert immer ungleich 0, sodaß mit dem Zugriff
01.
$r_nrm = fmt_rim(get_rim($wdt, $qrs, $arr_w, 0)); 
zumindest einmal ein gültiger Wert ungleich 0 gefunden wird. Wenn beim zweiten oder dritten Durchlauf ein Wert = 0 gefunden wird, erfolgt der Aufruf der Funktion ja mit dem Index 0, so daß dann wieder ein Wert ungleich 0 gefunden wird.

01.
$rim = get_rim($w, $q, $s, 0);  
Von daher sollte das keine Endlosschleife geben. Zudem läuft das Script ja ohne Probleme, sobald ein Wert über doe POST-Variable eingelesen wird.

Ich verstehe einfach nicht, wieso das Script "leer" auf den Hammer (Sprich: Endlosschleife) läuft, mit Daten aber nicht.

Gruß J chem
Bitte warten ..
Mitglied: Jochem
12.12.2013 um 11:33 Uhr
Moin,

01.
Notice: Undefined index: abreite in ... on line 8 - $wdt = $_POST["abreite"];  
02.
Notice: Undefined index: aquer in ... on line 9 - $qrs = $_POST["aquer"]; 
Sollte klar sein, da die Werte ja über eine POST-Variable aus dem aufrufenden Script übergeben werden.

01.
Notice: Undefined index:  in ... on line 22 - $arr_w = $arr[$qrs];
Auch klar, da, wenn die POST-Variable nicht "definiert" ist, auch die Zuweisung nicht "definiert" ist.

Gruß J chem
Bitte warten ..
Mitglied: nxclass
LÖSUNG 12.12.2013, aktualisiert um 18:32 Uhr
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
01.
<?php 
02.
error_reporting(E_ALL); 
03.
ini_set("display_errors", 1); 
04.
 
05.
$wdt = 80085; //@$_POST["abreite"]; 
06.
$qrs = 80;    //@$_POST["aquer"]; 
07.
$arrqrs = array( 
08.
    $arr[10] = array(0.95,0.00,0.00), 
09.
    $arr[20] = array(0.95,0.00,0.00), 
10.
    $arr[30] = array(0.98,0.00,0.00), 
11.
    $arr[40] = array(0.95,0.85,1.00), 
12.
    $arr[50] = array(0.85,0.75,0.95), 
13.
    $arr[60] = array(0.75,0.75,0.95), 
14.
    $arr[70] = array(0.75,0.60,0.85), 
15.
    $arr[80] = array(0.75,0.60,0.85), 
16.
); 
17.
#var_dump( $arrqrs ); 
18.
#var_dump( $arr ); 
19.
 
20.
if (!isset($qrs) || !isset($arr[$qrs])) { 
21.
    throw new Exception('invalid parameter for "aquer"'); 
22.
} else 
23.
if (!isset($wdt) || !is_numeric($wdt)) { 
24.
    throw new Exception('invalid parameter for "abreite"'); 
25.
26.
$arr_w = $arr[$qrs]; 
27.
 
28.
$r_nrm = fmt_rim(get_rim($wdt, $qrs, $arr_w, 0)); 
29.
$r_min = fmt_rim(get_rim($wdt, $qrs, $arr_w, 1)); 
30.
$r_max = fmt_rim(get_rim($wdt, $qrs, $arr_w, 2)); 
31.
 
32.
var_dump( array($r_nrm,$r_min,$r_max) ); 
33.
exit; 
34.
 
35.
function get_rim($w, $q, $s, $j) { 
36.
    $r = $s[$j]; 
37.
	if ($r == 0) { 
38.
	    $rim = get_rim($w, $q, $s, 0); 
39.
	    $t = round($w*$q/100); 
40.
	    if ($t >= 74) { 
41.
			if ($j == 1) $rim = $rim - 0.5; 
42.
			else $rim = $rim + 0.5; 
43.
44.
	} else { 
45.
	    $rim = round($w*$r/12.7)/2; 
46.
47.
	return($rim); 
48.
49.
	 
50.
function fmt_rim($w) { 
51.
	$x = intval($w,10); 
52.
	if ($x != $w) $x = $x + 0.5; 
53.
	return($x); 
54.
}
... leider kann man auch nicht erkennen was passieren soll, was von den Funktionen erwartet oder zurückgegeben wird - evtl. dazu mal paar Kommentare in den Code schreiben

PHP Version ?
01.
var_dump(memory_get_usage() ); 
02.
$arr = array( 2000000000 => 'Hallo Welt!', 0 => 'Hallo Welt!' ); 
03.
var_dump(memory_get_usage() ); 
04.
var_dump( $arr); 
05.
var_dump(memory_get_usage() ); 
06.
exit;
wie sieht die Ausgabe aus bei dir ?
Bitte warten ..
Mitglied: Jochem
12.12.2013, aktualisiert um 18:32 Uhr
Moin,

Jetzt, wo ich das schreibe und Deinen Kommentar nochmal lese, fällt mir auf, daß die Variablen ja im ersten Durchlauf, also wenn das Formular angezeigt wird und noch nicht auf "Senden" gedrückt wurde, zwar schon definiert, aber noch nicht mit Werten gefüllt sind. Dann trifft die NULL-Aussage ja zu.

Ergo setzt ich vor den Aufruf der Funktion eine Abfrage, ob die Variablen $wdt und $qrs schon gesetzt sind und laß die Funktion nur dann ausführen.

Mit der Änderung läuft es, wie ich es gerne hätte.

Danke für den "Schubs" in die richtige Richtung an euch Beide.

Gruß J chem
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Powershell: Parameter einer Funktion soll eine Funktion aufrufen
gelöst Frage von SaschaRDBatch & Shell3 Kommentare

Hallo zusammen, mein Ziel ist es die Zeitdauer einer Prozesses zu ermitteln. Dafür ist die folgende Funktion zuständig:Leider wird ...

JavaScript
Wie funktioniert der Aufruf für folgende Funktion?
gelöst Frage von PeacerJavaScript4 Kommentare

Hallo Zusammen, habe hier eine HTML Seite und möchte wissen wie folgender Funktionsaufruf funktioniert: Folgende JS Dateien wurden im ...

PHP
PHP Fatal Error (Maximum execution time)
gelöst Frage von JeeroyPHP5 Kommentare

Schönen guten Morgen. Mithilfe von Soap greife ich auf die Dell Datenbank zu, um zu prüfen, ob die eingegebene ...

JavaScript
Zweiter Aufruf einer Funktion unterbricht ersten Aufruf
gelöst Frage von BadgerJavaScript6 Kommentare

Hallo Leute, ich habe folgendes Problem: Ich habe eine JS Funktion welche dann eine jQuery ajax Funktion aufruft Soweit ...

Neue Wissensbeiträge
Linux

Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde

Information von Frank vor 59 MinutenLinux2 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 1 TagBatch & Shell9 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Humor (lol)

"gimme gimme gimme": Automatischer Test stolpert über Easter Egg im man-Tool

Information von Penny.Cilin vor 1 TagHumor (lol)6 Kommentare

Interessant, was man so alles als Easter Egg implementiert. Ist schon wieder Ostern? "gimme gimme gimme": Automatischer Test stolpert ...

MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 1 TagMikroTik RouterOS8 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Heiß diskutierte Inhalte
Router & Routing
Zwei Netzwerke erstellen
Frage von bunteblumeRouter & Routing13 Kommentare

Hallo Zusammen, Ich möchte gerne ein backup von einem bestimmten Folder welcher auf dem Server regelmässig synchronisiert wird auf ...

Off Topic
Fachkräftemangel in Deutschland? - Talentschmiede schreibt alle 2 Tage die gleichen Stellen aus
Frage von Penny.CilinOff Topic12 Kommentare

Hallo, haben wir in Deutschland Fachkräftemangel? Die Talentschmiede schreibt gefühlt alle zwei Tage dieselben Stellen aus. Und das schon ...

Microsoft Office
Outlook Cache Mode Frage
Frage von GwaihirMicrosoft Office11 Kommentare

Hallo zusammen, bin gerade neu in der Firma und lerne hier einige neue Dinge kennen. Zum Beispiel, dass die ...

Windows Server
Windows Store Apps
gelöst Frage von PeterleBWindows Server11 Kommentare

Gibt es einen Weg, auf Windows Server 2016 Windows Store Apps wie zum Beispiel die HP Smart App zu ...