Servus!
Ich habe ein Problem mit meinem PHP Code. Ich habe ihn mal stark vereinfacht unten reinkopiert.
Und zwar geht es darum, dass ich ein Skript laufen habe, welches alle 10 Minuten ein Mailpostfach prüft. Wenn eine E-Mail mit bestimmten Kriterien gefunden wird (Absender, Betreff, und gültiges XML im Body), dann wird die Mail weiterverarbeitet danach gelöscht. Ansonsten wird die Mail nur als gelesen markiert und danach irgendwann manuell gelöscht. (Das hat einfach den Grund, dass man alle paar Tage überprüfen kann, ob nicht doch eine E-Mail durchs Raster gerutscht ist...)
Die Weiterverarbeitung der Mail besteht aus dem Auslesen eines XML-Strings, und dem Speichern in einer Datenbank.
So.
Das Skript tut was es soll - es erkennt bestimmte E-Mails und speichert die gewünschten Daten in eine Datenbank. Das funktioniert auch richtig gut. Bis auf einen Haken:
Nach JEDEM Skriptaufruf wächst der Speicherbedarf des Windows-Apache um einige MB. Irgendwann ist kein Arbeitsspeicher mehr da, und der Apache schmiert ab (Startet i.d.R. aber wieder automatisch neu).
Warum ist das so? Was frisst hier so viel Speicher?
Ich schließe die Verbindung zum E-Mail Server doch jedes mal wieder ( mittels imap_close($mailbox); ).
Kann jemand in diesem (stark vereinfachten und gekürztem) Code einen Denkfehler finden? Oder hat sonst einer eine Idee woran das liegen könnte, dass das Skript immer mehr Speicher frisst und nicht mehr freigibt?
Vielen Dank und viele Grüße!
Ich habe ein Problem mit meinem PHP Code. Ich habe ihn mal stark vereinfacht unten reinkopiert.
Und zwar geht es darum, dass ich ein Skript laufen habe, welches alle 10 Minuten ein Mailpostfach prüft. Wenn eine E-Mail mit bestimmten Kriterien gefunden wird (Absender, Betreff, und gültiges XML im Body), dann wird die Mail weiterverarbeitet danach gelöscht. Ansonsten wird die Mail nur als gelesen markiert und danach irgendwann manuell gelöscht. (Das hat einfach den Grund, dass man alle paar Tage überprüfen kann, ob nicht doch eine E-Mail durchs Raster gerutscht ist...)
Die Weiterverarbeitung der Mail besteht aus dem Auslesen eines XML-Strings, und dem Speichern in einer Datenbank.
So.
Das Skript tut was es soll - es erkennt bestimmte E-Mails und speichert die gewünschten Daten in eine Datenbank. Das funktioniert auch richtig gut. Bis auf einen Haken:
Nach JEDEM Skriptaufruf wächst der Speicherbedarf des Windows-Apache um einige MB. Irgendwann ist kein Arbeitsspeicher mehr da, und der Apache schmiert ab (Startet i.d.R. aber wieder automatisch neu).
Warum ist das so? Was frisst hier so viel Speicher?
Ich schließe die Verbindung zum E-Mail Server doch jedes mal wieder ( mittels imap_close($mailbox); ).
Kann jemand in diesem (stark vereinfachten und gekürztem) Code einen Denkfehler finden? Oder hat sonst einer eine Idee woran das liegen könnte, dass das Skript immer mehr Speicher frisst und nicht mehr freigibt?
PHP-Code:
$mailbox = imap_open("{mail.server.de:143/novalidate-cert}INBOX","mail@adresse.de","passwort")
or die("Can't connect: " . imap_last_error());
$mails = imap_fetch_overview($mailbox,"1:*", FT_UID);
$size=count($mails);
for($i=$size-1;$i>=0;$i--){
$cmsg++;
$value = $mails[$i];
$empfaenger_adresse = $value->to;
$absender_adresse = $value->from;
$mail_datum = $value->udate;
$mail_subject = $value->subject;
$mail = imap_body($mailbox, $value->uid,FT_UID);
$structure = imap_fetchstructure($mailbox, $value->uid,FT_UID);
$ausgabe_log .= "Lese E-Mail ".$value->uid. " ... Empfaenger: $empfaenger_adresse Betreff: $mail_subject \r\n";
if($structure->encoding == 3) {
$mail = imap_base64($mail);
$ausgabe_log .= "Codierung base64 ... \r\n";
}
else if($structure->encoding == 4) {
$ausgabe_log .= "Codierung Quoted Print ... \r\n";
$mail = imap_qprint($mail);
}
//Hier weitere Bearbeitungen
//XML ermitteln und in DB Speichern, usw...
imap_delete($mailbox, $value->uid, FT_UID);
}
imap_expunge($mailbox);
imap_close($mailbox);
Vielen Dank und viele Grüße!
Kommentar