PHP Problem mit eigener Funktion

Chom

gehört zum Inventar
Hallo,
Wie der Titel schon sagt, komme ich mit einer Funktion nicht weiter.
Und zwar soll später das "Programm" in einer Datei einen Eintrag ändern.
Da ganze sieht wie folgt aus:
Die Variablen werden per GET gegeben, als erstes wird das Passwort gecheckt (übertragen als MD5, daher auch strcasecmp, weil das eine Programm alle Buchstaben Groß schreibt, aber die php md5 Funktion klein).
Wenn das Passwort stimmt, wird die zu ändernde Datei geöffnet, der Inhalt wird eingelesen, und aufgeteilt per explode in ein Array.
(In der Datei sind verschiedene Datensätze, einer umfasst 5 Daten, und ist wie folgt formatiert:
"xxx|yyy|ccc|vvv|bbb|"
der nächste sieht dann in der Struktur genau so aus, ist direkt daran angeschlossen, also das ich im Array, alle 5 Einträge einen Datensatz habe)
Dann werden 5 Inhalte des Arrays zusammengesetzt, mit dem zu ändernden verglichen, bei Übereinstimmung, wird das zusammengesetzte ersetzt mit dem "neuen".
Dann wird das zusammengesetzte in Inhalt geschrieben, und das Spiel geht von vorne los.
Dann soll der Inhalt wieder in die Datei (ist hier so umständlich über löschen, erzeugen, schreiben gelöst, weil sonst entweder Reste der alten Daten dableiben, oder php Warnungen ausgibt, wenn man versucht den Inhalt direkt in eine neue Datei einzufangen).

Das Problem ist jetzt, das es gar nicht mehr geht, es kommt die Meldung:
Fatal error: Maximum execution time of 12 seconds exceeded in /users/xxx/www/xxx/index.php on line 130

Ich hatte etwas geändert, davor ging es teilweise (man konnte den ersten Datensatz ändern, die anderen nicht).

Hier der PHP Text:
PHP:
if (strcasecmp ($user_passwort,$passwort)==0){
$datei = fopen("./TerminL/" . $Liste . ".ddl" ,"r+");
$inhalt = fgets($datei);
$teile = explode("|", $inhalt);
$Part = "";
$inhalt= "";
$i = 0;
while($i < count($teile)){
$Part = $Part . $teile[$i] . "~";
if($i == 4){
if(strcmp($Part,$_GET['Termin'])==0){
$Part = $_GET['d'] ."|" . $_GET['z'] ."|" . $_GET['o'] ."|" . $_GET['t'] ."|" . $_GET['b'];
}
$inhalt = $inhalt . $Part . "|"; // Das ist Zeile 130... Also der "Fehler"
$Part = "";
$i = 0;
}else{
$i++;
}
}
$inhalt = preg_replace("/~/", "|", $inhalt);
fclose($datei);
unlink("./TerminL/" . $Liste . ".ddl");
$datei = fopen("./TerminL/" . $Liste . ".ddl","w+");
fwrite($datei, "");
fclose($datei);
$datei = fopen("./TerminL/" . $Liste . ".ddl","r+");
fwrite($datei, $inhalt);
fclose($datei);
echo "OK";
}else{
echo "Error:Passwort";
}

DANKE schon mal!
Falls noch was offen ist, einfach fragen, ich hoffe ich habe alle wichtigen Daten genannt...
MFG,
chom
 

Supernature

Und jetzt?
Teammitglied
Läuft das Script lokal oder auf Deinem Webspace?
Die Meldung an sich ist eindeutig - ein Script darf auf diesem Server nicht länger als 12 Sekunden gelaufen, ansonsten wird es gekillt - was in diesem Fall dann auch geschehen ist.
Wenn Du selbst Zugriff auf die php.ini hast, musst Du dort den Wert bei max_execution_time erhöhen.
Wenn Du keinen Zugriff darauf hast, dann bleibt Dir nur, das Script so umzubauen, dass es mit weniger Laufzeit auskommt.
 

Hidden Evil

Moderator
Teammitglied
Ich kann leider nicht helfen, wäre an einem Lösungsvorschlag aber auch interessiert. Ich hatte mal eine Datenbank geführt, die aus nur einer Textdatei bestand. Die Zugriffs- und Speicherzeit ließ auch viele Wünsche offen. Aber 12 Sekunden habe ich nicht hinbekommen.

Wobei ich nur nicht verstehe, wieso Du alles in einer einzige Zeile speicherst, die Du immer nach 5 Feldern abtrennen musst. Zeilenweise wäre das einfacher, letztendlich hätte man ein zweidimensionales Array, mit dem man auch gut arbeiten kann.

Leider habe ich mein Script dazu nicht mehr und aus dem Kopf bekomme ich das nicht mehr hin, ist zu lange her.
 

Astrominus

Administrator
Teammitglied
Ich versuche solche Timeout-Geschichten damit auszutricksen, das ich das Script nach x Durchläufen immer wieder neu starten lasse.

Beispiel: Script arbeitet 10 Einträge ab, startet sich neu, arbeitet die nächsten 10 Einträge ab usw.

Ich habe es so schon geschafft ein Script 2 Stunden lang am laufen zu halten.

Für Dein Script weiß ich leider auf Anhieb auch nicht wie man das dort einsetzen könnte, aber vielleicht hilft Dir der Ansatz trotzdem weiter.

Besonders elegant geht das bei Datenbanken, da man dort die bereits bearbeiteten Einträge markieren könnte, die dann beim nächsten Durchlauf einfach ausgeschlossen werden.
 

Chom

gehört zum Inventar
Ich lasse das Skript auf einem Webserver laufen, da habe ich leider keinen Zugriff auf die php.ini.
Das mysteriöse ist ja aber, das es vorher unter 1 Sekunde gelaufen ist, besonders weil ich das nur zu testen laufen lasse (2 Einträge vorhanden).
Ich mache das mit dem Abtrennen so, weil ich die Daten nicht komplett auf einem Server bearbeite, sondern auch in einem Programm (auf dem Computer / zu Hause). Ist halt eine Art Online-Datenbank, auf die ich per Software vom PC aus zugreife, die Manipulation der Datei selber übernimmt dann halt mein Skript.
Aber trotzdem schon mal danke, werde mal überlegen, wie ich das besser hin bekomme...
 

Supernature

Und jetzt?
Teammitglied
12 Sekunden sind auf einem halbwegs leistungsfähigen Webserver eine Menge Holz, da lässt sich so Einiges abarbeiten - von daher vermute ich eher, dass Du einen Fehler in das Script eingebaut hast, der es z.B. in eine Endlosschleife schickt.
 

Chom

gehört zum Inventar
Du hattest recht!
Es lag an einer Endlos schleife, die ich mit etwas mehr Schlaf als in den letzten Tagen, dann heute gefunden habe: In der While Schleife war als variable ja i, aber gleichzeitig wurde i immer wieder "= 0" gesetzte, also endlos... Durch das hinzufügen einer zweiten variable geht es jetzt :D
DANKE!
 

Chom

gehört zum Inventar
Halleluja!
Es geht nun wirklich, also es funktioniert zu 98%.
Der Rest Fehler lag hier drinnen:
$inhalt = $inhalt . $Part . "|"
Es musste nur das . "|" weggelassen werden :rolleyes:
Naja die 2% nicht funktionieren ist, falls Umlaute im Text sind...
 
Oben