Seite 1 von 1

PHP: Speicher voll?

Verfasst: 24.10.2007, 19:42
von wuschba
Hi. Ich habe ein PHP-Script, was die gesamte Ausgabe mittels ob_start zurückhält, da zum Schluß noch ein paar Ersetzungen über den gesamten Text gemacht werden müssen. Das funktioniert lokal auch gut, nun habe ich jedoch eine etwas größere Seite (nunja, 280 KB html), da erhalte ich nun bei 1und1 auf dem Server einen Error 500. Lokal auf nem testrechner gehts.

Dies scheint mit der Ausgabe zusammenzuhängen, denn reduziere ich diese etwas, gehts auch bei 1und1.

Das Memory-Limit liegt dort laut phpinfo() bei 40 MB, laut memory_get_usage verbraucht mein Script aber nur ca. 1.9 MB (es werden ca. 200 Datensätze aus einer DB geholt und gespeichert. Dies umzustellen wäre nicht so gut..).

Jetzt bin ich etwas ratlos, was ich machen soll...?!?!?!? Ich habs schon mit init_set("memory_limit", 64) versucht, gab aber gleich einen 500er. Und nach meiner Rechnung müssten ja noch 40MB-1.9MB = 38.1MB frei sein.

Added: Habe lokal mal mein memory_limit auf 1 MB gesetzt: Das Script läuft immer noch. Argh.

Verfasst:
von

Verfasst: 24.10.2007, 22:51
von everflux
Mal so eine Frage: Könntest du es nicht irgendwie geschickter anstellen mit der Ausgabe und so, statt mit roher Gewalt?

Zu abstrakt? Um dir besser helfen zu können wären ein paar mehr Informationen nicht schlecht.

Verfasst: 25.10.2007, 07:55
von wuschba
Danke für Deine Antwort. Ja, ich habe auch schon drüber nachgedacht: Man kann ih PHP ja Output-Handler definieren, die z.B. nach jedem Zeilenumbruch aufgerufen werden. Ich ersetze aber z.B. auch Links aus Templates, die ich nicht beeinflussen kann und bricht so ein Link über eine Zeile um, würde das entsprechende preg_replace nicht mehr ansprechen.

Ich finde das Problem ja selbst sehr abstrakt ;-) Ich versuche schon seit gestern, ein Szenario zu schaffen, das leicht nachvollziehbar ist, das ist aber leider nicht so einfach :-? Ich dachte, es gäbe evtl. noch ein paar allgemeine Tipps, wie ich eher an den Fehler kommen oder ihn einkreisen kann.

Verfasst:
von

Verfasst: 25.10.2007, 08:12
von SloMo
Vielleicht die maximale Ausführungszeit?

Ansonsten würde ich mal im Error- und Exceptionhandling nachschauen. Wenn ein Errorhandler wiederum einen Fehler verursacht, könnte auch mal der Server abschmieren.

Verfasst: 25.10.2007, 09:48
von wuschba
Danke nochmal für die Antworten. Sorry: Ausführungszeit hatte ich hochgesetzt, der error_handler hat nichts ausgespuckt.

Ich habe es aber geschafft, das Problem zu isolieren: Es liegt doch nicht am Speicher (zumindets nicht an dem des Output-Buffers), sonderm am preg_replace. Folgendes Script bringt den Fehler auf einem Webhosting bei 1und1 (andere noch nicht getestet) sowohl auf php 4.4.7 als auch auf 5.2.6.:

Code: Alles auswählen

<?php
	$txt = "";
	for &#40;$i = 0; $i < 2000; $i++&#41;
	&#123;	$txt .= "<a href=\"helloworld.htm\" title=\"my title\"><img src=\"/mypic.jpg\"></a><br />\n";
	&#125;
	$txt = preg_replace&#40;"/<a&#40;.*&#41;href=\"\\index.htm\">/isU", "<a$1href=\"\\\">", $txt&#41;;
	print $txt;
?>
Das Script geht, wenn die Schleife nur bis 1000 läuft.

Verfasst: 25.10.2007, 13:28
von everflux
Mußt du das denn on-the-fly machen? Sonst bereite die daten doch in ruhe auf und lad sie auf die 1&1 kiste.

Verfasst: 28.10.2007, 11:23
von CIX88
Zuwas ist denn preg_replace dort überhaupt gut ?
Dein Pattern haut nicht ganz nicht.
Du ersetzt Leerzeichen wieder mit <a ... href...

Verfasst: 28.10.2007, 11:41
von Airport1
Sicher dass es nicht doch mit dem Speicher zusammenhaengt? PHP pflegt einen grob sehr verschwenderischen Umgang mit Speicher, insbes. sobald man mit Arrays arbeitet. Je nachdem welche PHP Version laeuft und wie diese konfiguriert ist, kanns dann schonmal 100mal mehr SPeicher belegen als auf nem anderen Server mit anderer PHP Version. Alles schon erlebt ;) Aber bei nem 500er sollte der erste Gang der sein, sich das (meist zumindest so aehnlich lautende) error.log vom Apache anzusehen, damit Du ueberhaupt die tats. Ursache erkennen kannst.

Verfasst: 28.10.2007, 11:50
von CIX88
> mit dem Speicher zusammenhaengt

Nö, das Script stirbt regelrecht durch das falsche Pattern bei preg_replace ab.
Da hängt sich preg_replace auf, schaut mal genau hin !

Verfasst: 28.10.2007, 12:16
von robo
Anstatt (.*) würde ich ([^>]*) schreiben ... oder (.*?) ...

Im Übrigen muss ein . escaped werden.

cu, Robo :)