php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 27.03.2011, 17:15  
DerApfel
Gast
 
Beiträge: n/a
Standard Speicher freigeben

Hallo,

in einem sehr speicherintensiven Skript habe ich mir gerade die folgende Meldung eingefangen:

Code:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 24 bytes) in /srv/www/dev/compiler on line 1792
Der Grund hierfür ist, denke ich, dass ich extrem viele Stringoperationen ausführe. Ich habe ca. 900 Dateien aus denen ich den Inhalt auslese, mit RegEx auf verschiedene Weisen bearbeite und dann in 2.700 neuen Dateien ablege. Der String mit dem Inhalt einer Ursprungsdatei wird also noch zusätzlich drei mal kopiert (in Zukunft bis zu 60 mal).

Meine Frage ist nun, wie ich unter PHP wieder Speicher zurückgeben kann, d.h. dass mein Skript nicht wieder neuen Speicher alloziert, sondern alte speicherbereiche freigibt und neu verwendet.

Viele Grüße und Danke im Voraus
Apfel

P.S.: Mir ist bewusst, dass die einfachste Problemlösung wäre, einfach das memory_limit in der php.ini hochzusetzen, aber das ist nicht in meinem interesse, da ich RAM sparen möchte
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.03.2011, 17:24  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Explizit mit unset, implizit beim Verlassen des Geltungsbereichs (zum Beispiel lokale Variablen innerhalb eines Funktionskörpers).

Musst du die Inhalte alle zeitgleich im Speicher halten beziehungsweise tust du das? Ich denke, es wäre gut, wenn du dazu etwas mehr Hintergrund postest.
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Alt 27.03.2011, 17:57  
DerApfel
Gast
 
Beiträge: n/a
Standard

Es gibt ca. 900 Dateien (können im Produktivbetrieb auch wesentlich mehr werden), welche im Schnitt ca. 40kB groß sind. Diese Dateien werden (bei besonderen Requests) alle nacheinander geöffnet.

Aus jeder der geöffneten Dateien wird für jede Sprache eine neue Datei generiert, im Stile von "Datei1.de", "Datei1.en", "Datei1.fr", "Datei2.de", "Datei2.en" usw.. Zusätzlich werden noch weitere Platzhalter mithilfe von RegEx und Datenbankinhalten ersetzt.

Meine bisherige Lösung hierfür kurz skiziert:
PHP-Code:
foreach($files as $file)
{
     
$content file_get_contents($file);
     foreach(
Languages::getLanguages() as $language)
     {
          
$c $content;
          
$c preg_replace(...);
          
file_put_contents($file.".".$language->getShortCode(), $c);
     }

Beziehungsweise hier der aktuelle Code:
PHP-Code:
foreach(Language::getLanguages() as $lang)
        {
            
$current $c;
            
$matches = array();
            
preg_match_all("/(\\{lang=\'([^']*)\'\\})/is"$current, &$matches);
            foreach(
$matches[0] as $match)
            {
                
$key str_replace("{lang='"""$match);
                
$key str_replace("'}"""$key);
                
$current str_replace("{lang='".$key."'}"$lang->getItem($key), $current);
            }
            
$current utf8_encode($current);
            
file_put_contents($target.".".$lang->langID$current);
            unset(
$current);
        } 

Geändert von DerApfel (27.03.2011 um 18:00 Uhr).
  Mit Zitat antworten
Alt 27.03.2011, 18:41  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Das sieht für mich okay aus. Ich vermute, das Speicherleck verbirgt sich anderswo.

Nebenbei: Welche PHP-Version ist das?
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Alt 27.03.2011, 18:48  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.945
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

Mit file_get_contents() liest du eine komplette Datei in einen String. Du könntest das so umstellen, dass du die Dateien immer nur Zeile für Zeile einliest und die bearbeitete Zeile dann wegschreibst.
__________________
Warum denkt mein Hund eigentlich immer dann, wenn es an der Tür klingelt, es sei für ihn?
Wolla ist offline   Mit Zitat antworten
Alt 27.03.2011, 19:21  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

alternativ, job-management und nicht alle files "one charge" abarbeiten..

hast du dir schon das Speicher-allocating angesehen was dein script produziert ? ( cycle-weise innerhalb jedes foreach's ) Man kann eigentlich recht schnell herausfinden was da wo wann und wie den speicher vollmüllt.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 27.03.2011, 20:19  
DerApfel
Gast
 
Beiträge: n/a
Standard

@Wolla: Halte ich für eher ungesund, da ja doch relativ viele RegEx drauf ausgeführt werden.

Das einzige Problem scheint die Funktion jedoch nicht zu sein, da scheints noch an ner zweiten stelle zu haken... Das Problem ist, dass ich hier über 300 Klassen habe, die zur Anwendung gehören und ich einfach nicht die Zeit habe, jeder einzelnen beim arbeiten zuzusehen. Gibt es Tools die herausfinden können, welche Klassen die größten Zeit- / Speicher-Fresser sind?
  Mit Zitat antworten
Alt 28.03.2011, 17:53  
Benutzer
 
Registriert seit: 25.03.2011
Beiträge: 52
PHP-Kenntnisse:
Fortgeschritten
Maxefix befindet sich auf einem aufstrebenden Ast
Standard

Da sollte doch ein handelsüblicher PHP-Profiler wertvolle Dienste leisten. Beispiel: XDebug.

Gruß,
Max
Maxefix ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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 an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Speicher freigeben hr3 PHP Einsteiger 12 26.01.2011 23:29
[Erledigt] Speicher (RAM) verbrauch ausgeben eMBi PHP Tipps 2009 3 27.10.2009 15:07
[Erledigt] Vererbung überfüllt Speicher? seejay PHP Tipps 2009 3 14.05.2009 11:41
Speicher reicht nicht aus stefanjann PHP Tipps 2006 9 10.11.2006 11:17
Speicher dem MySQL-Server zuweisen bendigo Datenbanken 0 29.09.2006 14:36
User erst nach Freigabe freigeben Nevermind Datenbanken 7 07.05.2006 23:54
8 MB Speicher voll - alle Variabeln freigeben wie aber.... janni PHP Tipps 2006 10 30.03.2006 11:59
[Erledigt] Speicher läuft unerklärlich voll. PHP-Fortgeschrittene 11 02.03.2006 13:23
Datei zeigen, aber nicht zum Download freigeben CSS PHP-Fortgeschrittene 17 12.01.2006 17:30
Ordner über / freigeben (ScriptAlias funkt nicht) schifti Server, Hosting und Workstations 0 13.06.2005 15:19
Generiertes Bild im Speicher cachen Ypsillon PHP Tipps 2005 3 04.03.2005 19:15
parser stack overflow kann ich den php speicher erweitern ? PHP Tipps 2005 2 24.01.2005 10:01
Freigeben / Löschen Funktion - msgId unterscheiden? Paulo PHP Tipps 2004 5 28.10.2004 12:41
[Erledigt] Apache frisst speicher, Downlad grosser Datein über PHP Server, Hosting und Workstations 3 28.09.2004 20:07
bilder...speicher problem... Sclot PHP Tipps 2004 7 19.07.2004 20:10

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php speicher freigeben, javascript speicher freigeben, php script speicher freigeben, php variable freigeben, php.ini speicher freigeben, php speicher freimachen?, script speicher freigeben, php mysql speicher freigeben, speicher leeren bei file_get_content php, php klasse speicher freigeben, php memory freigeben, php speicher wieder freigeben, xdebug variable speicherbelegung ausgeben, php speicher freigabe, speicher freigeben allowed memory size of, speicher freigeben script, file_get_contents liest alte datei aus, php profiler speicher klasse, \fatal error: allowed memory size of\ utf8_encode(, mysqlspeicher zuweisen

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:31 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum