Speichertest auf Webserver

Ich habe Große Probleme mit einem ION Cube mudol das in unser PHP basierte Webseite eingbunden ist. Laut Kundenbetreuung des Anbieters steht nicht genug speicher zur Verfügung obwohl der Server über 1GB RAM vefügt. Als standart memory limit sind 100 MB eingestellt und das Modul benötigt mindestend 300 MB. Bevor das Modul aufgerufn wird setzte ich das Limit mit ini_set auf 700 MB aber das Ergebnis ist Trotzdem ein „internal server error“.

Um sicher zu gehen das ini_set auch funktioniert habe ich folgendes test skript gescjrieben:

<?php function tryAlloc($megabyte){<br /> echo "try allocating {$megabyte} megabyte...";
 $dummy = str\_repeat("-",1048576\*$megabyte);
 echo "pass.";
 echo "Usage: " . memory\_get\_usage(true)/1048576; 
 echo " Peak: " . memory\_get\_peak\_usage(true)/1048576;
 echo "\n";
} 
for($i=10;$i\<1000;$i+=50){
 $limit = $i.'M';
 echo "set memory\_limit to {$limit}\n"; 
 ini\_set('memory\_limit', $limit); 
 echo "memory limit is ". ini\_get("memory\_limit")."\n";
 tryAlloc($i-10);
}

?\>

kann ich jetzt davon ausgehen das die Aussage des Kundendienst (mal wieder) falsch ist, oder ist mir bei meinem Test ein Fehler unterlaufen?

Sorry ich kann dir da leider nicht weiterhelfen, da ich selbst noch Anfänger bei PHP bin.
Es gibt in diesem Forum aber bestimmt Experten dafür.
Viel Glück bei der Suche.

Kommt drauf an bei welchem Provider das ganze läuft, sind das die üblichen Webpakete wie von 1und1, oder Strato, oder ist das ein dedizierter Server?

Meist ist ini_set ohne Wirkung, gerade im Bezug auf den Speicher, da die Webpakete virtuell auf einem Server laufen und sich alle entsprechenden Kunden die Resourcen teilen müßen.

Des weiteren muß ein Internal Server error nicht unbedingt mit dem Speicher zusammenhängen, das kann zum Beispeil auch daran liegen das die Ausführungszeit vom Script überschritten wurde.

Gibt es da vielleicht ausführliche Logs zu, oder Fehlermeldungen, denn ein 505 error kann vieles sein.

Kommt drauf an bei welchem Provider das ganze läuft, sind das
die üblichen Webpakete wie von 1und1, oder Strato, oder ist
das ein dedizierter Server?

Dedizierter managed Server mit 1GB Speicher garantiert.

Meist ist ini_set ohne Wirkung, gerade im Bezug auf den
Speicher, da die Webpakete virtuell auf einem Server laufen
und sich alle entsprechenden Kunden die Resourcen teilen
müßen.

Genau das will ich ja testen. Also erzeuge ich per Skript einen string mit 900*1024*1024 Zeichen was in etwa 900 MB speicher braucht.

Des weiteren muß ein Internal Server error nicht unbedingt
mit dem Speicher zusammenhängen, das kann zum Beispeil auch
daran liegen das die Ausführungszeit vom Script überschritten
wurde.

Gibt es da vielleicht ausführliche Logs zu, oder
Fehlermeldungen, denn ein 505 error kann vieles sein.

Genau das ist mein Problem. Auf die Logs habe ich kein lese rechte und da das ganze mit ION Cube geschützt ist
habe ich keinerlei Einblick in den Code.

Der support besteht darauf das der Server einfach nicht genug Leistung hat, ich glaube das ihr Modul verbuggt ist.

Deshalb will ich mit dem Skript ja testen ob ini_set auf dem Server auch wirklich funktioniert.
Aber wenn ich einen String mit 1024*1024 * 900 Bytes erzeugen kann „und memory_get_usage(true)/1048576;“
mir 900,5 liefert habe ich doch offensichtlich 900MB zur Verfügung.

Ach ja das Skript solll eine 80MB csv in die Datenbank importiren :confused:

Ahhh, jetzt, 80mb csv, das war das Stichwort :smile:

Das liegt definitiv nicht an zu wenig Arbeitspeicher, sondern an der Ausführungszeit für das Script, um die ganzen Datensätze abzuarbeiten.

Bei 80mb werden das ein paar tausend sein, wenn da eine Schleife durchläuft braucht die Zeit, sprich mal mit ini_set(‚max_execution_time‘, 300); versuchen, das sind 5 Minuten und sollte mehr als reichen, je nachdem wie schnell, oder langsam der Server ist.

Falls das nicht funktioniert, was bei Webpaketen und managed Servern meist der Fall ist, kann man die csv nur noch aufsplitten, oder in Paketen zu je bestimmter Anzahl Zeilen importieren.

Mit Mysql 5 gibt es auch die Möglichkeit eine CSV direkt zu laden und zu importieren, als Beispiel mit diesem SQL-Statement:

LOAD DATA INFILE „./csv.txt“ INTO TABLE datenbank.meine_tabelle;

Kommt drauf an bei welchem Provider das ganze läuft,

sind das

die üblichen Webpakete wie von 1und1, oder Strato, oder ist
das ein dedizierter Server?

Dedizierter managed Server mit 1GB Speicher garantiert.

Meist ist ini_set ohne Wirkung, gerade im Bezug auf den
Speicher, da die Webpakete virtuell auf einem Server laufen
und sich alle entsprechenden Kunden die Resourcen teilen
müßen.

Genau das will ich ja testen. Also erzeuge ich per Skript
einen string mit 900*1024*1024 Zeichen was in etwa 900 MB
speicher braucht.

Des weiteren muß ein Internal Server error nicht unbedingt
mit dem Speicher zusammenhängen, das kann zum Beispeil auch
daran liegen das die Ausführungszeit vom Script überschritten
wurde.

Gibt es da vielleicht ausführliche Logs zu, oder
Fehlermeldungen, denn ein 505 error kann vieles sein.

Genau das ist mein Problem. Auf die Logs habe ich kein lese
rechte und da das ganze mit ION Cube geschützt ist

habe ich keinerlei Einblick in den Code.

Der support besteht darauf das der Server einfach nicht genug
Leistung hat, ich glaube das ihr Modul verbuggt ist.

Deshalb will ich mit dem Skript ja testen ob ini_set auf dem
Server auch wirklich funktioniert.

Aber wenn ich einen String mit 1024*1024 * 900 Bytes erzeugen
kann „und memory_get_usage(true)/1048576;“

mir 900,5 liefert habe ich doch offensichtlich 900MB zur
Verfügung.

Ach ja das Skript solll eine 80MB csv in die Datenbank
importiren :confused:

Ahhh, jetzt, 80mb csv, das war das Stichwort :smile:

Das liegt definitiv nicht an zu wenig Arbeitspeicher, sondern
an der Ausführungszeit für das Script, um die ganzen
Datensätze abzuarbeiten.

Ich hatte schon „set_time_limit(0);“.
Weder das noch ini_set(‚max_execution_time‘, 300);
Helfen weiter.

Mit Mysql 5 gibt es auch die Möglichkeit eine CSV direkt zu
laden und zu importieren, als Beispiel mit diesem
SQL-Statement:

Naja das Modul macht schon etwas mehr als den reinen Import(alte Datensätze löschen/aktualisiren etc). aber darauf habe ich sowieso keinen Einfluss -.-

Ich denk mir auch die ganze Zeit, das ich den Import lieber selbst geschrieben hätte aber wen mein Boss das Modul will…

Also Aktuell versuche ich es hiermit:
ini_set(‚memory_limit‘, ‚990M‘);
ini_set(‚max_execution_time‘, 900);
set_time_limit(900);
ignore_user_abort(true);

Wenn set_time keine Funktion hat, kann das eventuell daran liegen das PHP im safemode läuft.

Da das ein managed Server ist wird ini_set nicht funktionieren, da der Kunde keinen Einfluss auf die Konfiguration nehmen darf, wegen der Rechtslage.

Als letzter Ausweg würde mal ein Blick in die php-konfiguration helfen mit phpinfo(); dann läßt sich vielleicht das ganze eingrenzen, wenn schon keinerlei Fehlermeldungen, oder Logs zur Verfügung stehen.

Übrigens um was für ein Modul handelt es sich eigentlich? Bzw. um welche Software geht es?

Wenn set_time keine Funktion hat, kann das eventuell daran
liegen das PHP im safemode läuft.

Nein der safe mode ist aus…

Da das ein managed Server ist wird ini_set nicht
funktionieren, da der Kunde keinen Einfluss auf die
Konfiguration nehmen darf, wegen der Rechtslage.

Ich glaube das ini_set funktioniert. Das Skript in meiner Anfrage soll ja testen ob ini_set() funktiert. Wenn ich erst ini_set(‚memory_limit‘, „950M“); aufrufe kann ich auch einen string mit 900*1025*1024 zeichen anlegen. Rufe ich ini_set nicht auf,
dann überschreite ich das Speicherlimit. Meine Schlußfolgerung ist das ini_set zumindest für das Speicher-Limit aktiv ist.

Kann man ini_set auch nur für einige Einstellungen aktivieren? Also zum Beispiel für das Speicherlimit aber nicht für die maximale Ausführungszeit?

Als letzter Ausweg würde mal ein Blick in die
php-konfiguration helfen mit phpinfo(); dann läßt sich
vielleicht das ganze eingrenzen, wenn schon keinerlei
Fehlermeldungen, oder Logs zur Verfügung stehen.

Schon geschehen:
max_execution_time 60
memory_limit 100M

Übrigens um was für ein Modul handelt es sich eigentlich?
Bzw. um welche Software geht es?

Namen darf ich auf Weisung des Managments leider ncht nennen. Wir bekommen täglich eine ZIP Datei via FTP auf unserem Server. Das Modul entpackt diese und aktualisiert dann die Datenbank.

Anfangs brach das Skript mit der Fehlermeldung ab das der maximale Speicher überschritten wurde.
Sobald ich das Speicher-Limit erhöhe kriege ich überhaupt keine Ausgabe mehr sondern nur einen „internal server error“.

Erst ging ich davon aus das ini_set() deaktiviert ist oder ich einen Fehler beim erhöhen des Speicher-Limits mache.

Aber wen das der Fall ist warum läuft dann mein Testskript?

Da es schon mehrfach Probleme mit dem Modul (und dem Support) gab wollte ich vor einer erneuten Support Anfrage sicher sein das mein Test auch wirklich das testet was er testen soll und meine Schlussfolgerungen korrekt sind.