zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden [PHP] Probleme mit simplexml_* (Memory Exceed)

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 03.06.2010, 16:23
Software Engineer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 03.01.2008
Ort: Altleiningen
Beiträge: 305
markuskoehler kann nur auf Besserung hoffen
Ausrufezeichen [PHP] Probleme mit simplexml_* (Memory Exceed)

Hi Leute!

Ich hab mal wieder ein Problem. In der Vergangenheit hatte ich meine Konfigurationsvariablen in .ini-Dateien gespeichert, die ja aber einige Nachteile haben. Momentan sitze ich grad an meinem ersten Projekt, in dem ich mit Konfigurationsvariablen per .xml-Datei arbeite. Allerdings habe ich nun plötzlich anscheinend Probleme mit der XML-Verarbeitung per SimpleXML... Sind schon so nervig, dass ich mir überlegt habe, nun auf Datenbank umzusteigen -.-"

Aber will ich mal mehr ins Detail gehen: Mein eigentliches Problem begann mit einem
Code:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 8192 bytes)
Fehler. Diesen hat meine config.class.php geworfen, anscheinend an der Stelle, wo ich die die Zeilen der config.xml per file_get_contents() und explode in einen Array geschrieben habe. Das KANN aber praktisch gar nicht sein, da die config.xml nur ne halbe Seite groß ist... Habe bissl auf PHP.net in der Doku rumgestöbert und festgestellt, dass file_get_contents() nicht die schnellste und speichersparendste Funktion sein soll, darum bin ich auf fopen, fread, fclose umgestiegen. In Verbindung damit habe ich simplexml_load_file() dann in simplexml_load_string() geändert. Jetzt kriege ich diesen "Memory Exceeded"-Error aber bei der simplexml_load_file()-Funktion...

Das war nur der grobe Ablauf, dazwischen hatte ich an verschiedenen anderen Stellen der gleichen Datei den gleichen Fehler. Ein sehr erfahrener PHP-Programmierer hatte mir noch geraten, in der Fehlerbehandlungsfunktion, wie sie irgendwo unter simplexml_load_file() auf PHP.net verlinkt ist (display_xml_error()) die Fehlervariable nur zu referenzieren, weil sie dann keinen eigenen Speicher verbraucht. Aber hat nichts geholfen... Ich bin ratlos!! Vor diesem Fehler hatte ich auch noch gar keine Ausgabe und habe mithilfe des W3C_Validators rausgefunden, dass die Kompression irgendwie nicht gepasst hat. Jetzt habe ich in meinem lokalen Apache bzw. PHP zlib_compression ausgestellt, woraufhin ich diese Fehler bekam... Keine Ahnung ob das zusammenhängen kann. Hatte auch mit ob_start() und ob_end_flush() gearbeitet, sind jetzt auskommentiert... Ich bin ratlos...

Hoffe, ich habe mich nicht zu kompliziert ausgedrückt und irgendwer kann mir helfen...
__________________
MfG Markus Köhler
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 04.06.2010, 01:17
Benutzerbild von Pascolo
Stiller Leser
XHTMLforum-Mitglied
 
Registriert seit: 24.11.2007
Ort: Cham
Beiträge: 640
Pascolo sorgt für eine eindrucksvolle AtmosphärePascolo sorgt für eine eindrucksvolle Atmosphäre
Standard

Wie umfangreich ist denn diese XML-Datei? Ohne den Quellcode wird es natürlich schwierig, den Fehler zu finden.
__________________
Mit freundlichen Grüssen "Pascolo"

Guter Webspace eSport Topliste Meine Lesezeichen Meine Spielwiese

Geändert von Pascolo (04.06.2010 um 01:23 Uhr) Grund: Ergänzung
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 04.06.2010, 10:10
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 29.07.2005
Beiträge: 1.073
xm22 befindet sich auf einem aufstrebenden Ast
Standard

Ich denke auch, die Konfiguration ist zu groß.
__________________
... Meine Meinung
Mit Zitat antworten
  #4 (permalink)  
Alt 04.06.2010, 10:32
Benutzerbild von mantiz
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 25.02.2007
Beiträge: 2.843
mantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz sein
Standard

Aber er schreibt doch "'ne halbe Seite", da gehe ich eher von 20-30 Zeilen aus, wobei ich durchschnittlich lange Zeilen voraussetze. Das sollte eigentlich weit davon entfernt sein irgendein Speicherproblem hervorrufen zu können.

Aber ich wär' auch dafür die XML-Datei und PHP-Code zu sehen.
Mit Zitat antworten
  #5 (permalink)  
Alt 04.06.2010, 12:15
Software Engineer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 03.01.2008
Ort: Altleiningen
Beiträge: 305
markuskoehler kann nur auf Besserung hoffen
Ausrufezeichen

Jap, 'ne halbe Seite, hatte ich geschrieben.

Aber kein Problem, hier den Code:

config.xml
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<config>
	<site>
		<https_prefix>https://ssl-id.de/</https_prefix>
		<development_host>test.p-its.biz</development_host>
		<production_host>p-its.biz</production_host>
		<api_host>api.p-its.biz</api_host>
		<local_str>selfip</local_str>
	</site>
	<db>
		<development>
			<host>p-its.selfip.biz</host>
			<user>root</user>
			<password>millich</password>
			<database>pits</database>
		</development>
		<production>
			<host>rdbms.strato.de</host>
			<user>U695508</user>
			<password>millich13</password>
			<database>DB695508</database>
		</production>
	</db>
	<lang>
		<allowed_langs>de,en</allowed_langs>
	</lang>
	<page>
		<search_path>./pages/</search_path>
		<title_separator>::</title_separator>
		<title_suffix>Personal IT-Services</title_suffix>
		<style_path>./style/pages/</style_path>
	</page>
	<rights>
		<admin_pages>admin</admin_pages>
		<user_pages>user</user_pages>
		<prospect_pages>prospect</prospect_pages>
		<buyer_pages>buyer</buyer_pages>
	</rights>
</config>
config.class.php
PHP-Code:
<?php

/**
 * config
 * 
 * @package pits
 * @author Markus Köhler
 * @copyright Copyright 2010 Personal IT-Services. All Rights Reserved.
 * @version 1.0.0.0 stable OOP
 * @access public
 */
class config extends base implements iconfig {
    private 
$conf;
    
    public function 
__construct($config_file './config.xml') {
        if(!
is_file($config_file)) {
            
Header('Content-Type: text/plain; charset=UTF-8');
            exit(
'ERROR: Unable to load configuration file (\'' $config_file '\')!');
        } else {
            
libxml_use_internal_errors(true);
            
//$this->conf = simplexml_load_file($config_file, 'SimpleXMLElement', LIBXML_COMPACT);
            
$ch fopen($config_file'r');
            
$data fread($chfilesize($config_file));
            
fclose($ch);
            
$this->conf simplexml_load_string($data'SimpleXMLElement'LIBXML_COMPACT);
            
//$xml = explode("\n", file_get_contents($config_file));
            
$xml explode("\n"$data);
            if(!
$this->conf) {
                
Header('Content-Type: text/plain; charset=UTF-8');
                
$got_errors libxml_get_errors();
                foreach(
$got_errors as &$error) {
                    echo 
$this->display_xml_error($error$xml);
                };
                
libxml_clear_errors();
                exit();
            };
        };
    }
    
    private function 
display_xml_error($error$xml) {
        
$return  $xml[$error->line 1] . "\n";
        
$return .= str_repeat('-'$error->column-1) . "^\n";

        switch(
$error->level) {
            case 
LIBXML_ERR_WARNING:
                
$return .= "Warning $error->code: ";
                break;
            case 
LIBXML_ERR_ERROR:
                
$return .= "Error $error->code: ";
                break;
            case 
LIBXML_ERR_FATAL:
                
$return .= "Fatal Error $error->code: ";
                break;
        };

        
$return .= trim($error->message) .
                    
"\n  Line: $error->line.
                    
"\n  Column: $error->column";

        if(
$error->file) {
            
$return .= "\n  File: $error->file";
        };

        return 
"$return\n\n--------------------------------------------\n\n";
    }
    
    public function 
get($xpath) {
        
$x_path $this->conf->xpath('/' __CLASS__ '/' str_replace('.''/'$xpath));
        if(!isset(
$x_path) || empty($x_path)) {
            echo 
'ERROR: Unable to address node (\'' $xpath '\')!';
        } else {
            return 
$x_path[0];
        };
    }
};
?>
__________________
MfG Markus Köhler
Mit Zitat antworten
  #6 (permalink)  
Alt 04.06.2010, 13:06
Benutzerbild von mantiz
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 25.02.2007
Beiträge: 2.843
mantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz sein
Standard

Möglich, dass du vorher den Speicher schon so dermaßen voll haust, dass die kleine config da nicht mehr reinpasst?

Folgender Test läuft ohne Probleme:
PHP-Code:
<?php

$config_file 
'config.xml';

$ch fopen($config_file'r');
$data fread($chfilesize($config_file));
fclose($ch);
$conf simplexml_load_string($data'SimpleXMLElement'LIBXML_COMPACT);

echo 
'<pre>';
var_dump($conf);
echo 
'</pre>';

?>
Also, was läuft vorher alles ab?

PS: Ich würde zumindest die Passwörter aus der config entfernen und nun auch ändern.
Mit Zitat antworten
  #7 (permalink)  
Alt 04.06.2010, 13:23
Software Engineer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 03.01.2008
Ort: Altleiningen
Beiträge: 305
markuskoehler kann nur auf Besserung hoffen
Ausrufezeichen

Davor...

lade ich die Interfaces, dann die Base-Klasse, eine Dateiverarbeitungs-Klasse (um alle Dateien rekursiv inkl. Pfad in einen Array einzulesen), dann schon die config-Klasse.

Danach...

die Datenbankverbindungs-Klasse, eine Datum/Zeit-Klasse, eine Sprachenumschaltungs-Klasse (übrigens konnte ich hierin nie Cookie-Probleme lösen im aktuellen Projekt, bin jetzt zu einer Lösung ohne Cookies übergegangen, die aber sicher nicht so benutzerfreundlich ist), dann noch dpe Seiten-Klasse, die eigentlich alle Inhalte läd, und zu guter Letzt die User-Klasse, die Login und alles was damit zu tun hat regelt...

Dies alles wird umrundet von einer Abfrage, ob statt der ganzen Seite nur die IP oder der Hostname des Users als Plain-Text zurückgegeben werden soll (für bestimmte Funktionen meiner Software-Projekte, die dann einfach diese URL aufrufen können, oder ob ich nur phpinfo() will statt meiner Website. Dann werden die Locale und Zeitzone gesetzt, ich definiere 3 Konstanten, starte die Session, habe enie Autoloading-Funktion für die Klassen vor den Klassen selbst, dann danach ein error_reporting()-Switch, Ausgabe von 3 Headern, Bestimmung des Last-Modified-Datums (angelehnt an die Lösung auf PHP.net), und letztendlich wird der HTML-Code der Seite von ob_start() und ob_end_flush() umrundet, weil ich bisher erstmal 2 Variablen im HTML-Code ersetzen wollte, also zur Nachverarbeitung des Quellcodes.

Das ist praktisch die ganze Site...
__________________
MfG Markus Köhler
Mit Zitat antworten
  #8 (permalink)  
Alt 04.06.2010, 14:42
Benutzerbild von mantiz
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 25.02.2007
Beiträge: 2.843
mantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz sein
Standard

Das hört sich alles nicht besonders Speicherintensiv an. Um eigene Probleme auszuschließen würde ich einfach mal schauen, wieviel Speicher PHP an bestimmten Stellen verbrät. Mit memory_get_usage() kannst Du Dir den Speicherverbrauch anzeigen lassen.

Ich würd's zunächst einmal zu Beginn des Scriptes ausgeben und einmal direkt vor der Zeile, die die Fehlermeldung produziert. Wenn der Speicherverbrauch dort bereits recht hoch ist, dann würde ich versuchen das Problem Stück für Stück einzugrenzen.

Vielleicht hat ja jmd. anders noch 'ne Idee, aber ich seh' da gerade keine kritischen Dinge.
Mit Zitat antworten
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
paar Probleme mit dem CSS Layout SimonK. CSS 6 05.10.2008 15:57
IE: Probleme mit ul-Menü Ares CSS 4 18.10.2006 12:42
[PHP] Probleme mit .htaccess und include(); Ahoj Serveradministration und serverseitige Scripte 4 01.02.2006 15:13
[PHP] Probleme mit include schdeffan Serveradministration und serverseitige Scripte 4 17.09.2005 13:39
Probleme mit Mehrspaltigem Layout RalfEggert CSS 0 27.09.2004 17:39


Alle Zeitangaben in WEZ +2. Es ist jetzt 08:30 Uhr.