pt004: memory limit - timeout

Hallo, meine Seite, die einem feedreader gleichkommt, verabschiedet sich, nachdem sie geladen wurde, nach einer Weile und die Seite wird ohne Fehlermeldung geladen, aber die Seite bleibt leer. Der provider-helpdesk schrieb mir dazu folgendes:

„Ich hatte die Seite gestern noch fast 3 Stunden geöffnet und hatte dann kurz vor Ende "endlich" das erwartete Timeout, also den weissen Bildschirm. Heute Morgen habe ich zwei unserer Techniker konsultiert, die sich die Sache einmal angeschaut haben. Wir vermuten, dass der Code hier das Memory Limit (memory_limit = 128MB) überschreitet und dann zum Timeout führt. ...Ein weiteres Problem ist, dass Sie Ihre RSS Feeds und Seiteninformationen direkt in Ihrem PHP-Code eingebettet haben. Es gibt keinen Cache oder Ajax (Siehe: de.wikipedia.org/wiki/Ajax_(Programmierung) ) welcher das Laden der Daten übernimmt, um ein Timeout zu verhindern. Wenn Sie den Code diesbezüglich optimieren könnten Sie nicht nur das Timeout verhindern, sondern auch wesentlich schnellere Ladezeiten erreichen.“

Könnte mir jemand einen konkreteren Tipp geben, wie ich da vorgehen sollte?
In Sachen Ajax habe ich bisher keine Ahnung - Cronjobs bietet der provider nicht an.

Seite Danke ! pto

  1. Hallo,

    Kann es sein, dass du momentan *alle* Feeds bei *jedem* Aufruf herunterlädst, auswertest und das HTML generierst?

    Falls ja, so speichere diese Daten einige Zeit auf dem Server zwischen (das, was der Helpdesk-Mitarbeiter Caching genannt hat). Das kann in einer Datenbank oder einfachen Dateien passieren. Dazu müsstest du mit PHP Dateien lesen und schreiben.

    Um das Memory-Limit zu umgehen, kannst du wie vorgeschlagen jeden Feed in einem gesonderten Request bearbeiten und die Ausgabe mit JavaScript (XMLHttpRequest, »Ajax«) in die Seite montieren. Damit wird das PHP-Script mehrfach gleichzeitig gestartet, aber jeder Prozess kümmert sich nur um einen Feed, sodass das Memory-Limit nicht erreicht wird.

    In Sachen Ajax habe ich bisher keine Ahnung

    Mehr als auch die einschlägigen Erklärungen zu verweisen, wie es der Helpdesk-Mitarbeiter getan hat, können wir auch nicht.

    Cronjobs bietet der provider nicht an.

    Brauchst du auch nicht.

    Mathias

    1. Danke für die Antwort.

      Ja, ich rufe jedesmal wieder alle feeds auf, weil die sich ja relativ schnell ändern können. Meine Frage, wenn ich sie abrufe und zwischenspeichere, nach 5 Minuten die Seite wieder neu aufbaue, muss ich doch wieder im Originalfeed nachschauen, ob sich was geändert hat, damit muss ich doch wieder die einzelnen feeds holen und wieder in die cache-Datei schreiben usw. Dadurch wird doch das Laden nicht kürzer.

      Die anderen Hinweise will ich mir gerne noch mal in Ruhe zu Gemüte führen.

      Vronjobs wären halt gut, weil dann immer schon im Hintergrund die feeds geladen würden und man immer schon etwas vorfände, wenn man die Seite aufruft.

      Gruß
      pto

      Mathias

      1. Hallo!

        Meine Frage, wenn ich sie abrufe und zwischenspeichere, nach 5 Minuten die Seite wieder neu aufbaue, muss ich doch wieder im Originalfeed nachschauen, ob sich was geändert hat

        Ja, richtig.

        damit muss ich doch wieder die einzelnen feeds holen und wieder in die cache-Datei schreiben usw.

        Ja, richtig.

        Dadurch wird doch das Laden nicht kürzer.

        Einmal im Zeitintervall dauert *ein* Request lange, alle anderen Request werden blitzschnell aus dem Cache beantwortet. Daher mein Vorschlag (bzw. der Vorschlag des Helpdesk-Mitarbeiters), pro Feed einen Server-Request zu machen (mit JavaScript, XMLHttpRequest).

        Wenn das Script nur für einen Feed ausgeführt wird, muss es auch nur einen Feed pro Zeitintervall holen. Das braucht serverseitig wenig Speicher und dauert nicht lange. *Einzeln* betrachtet, versteht sich. *In der Summe* ist es mindestens gleich langsam und sogar speicherintensiver, da viele PHP-Scripte parallel ausgeführt werden. Auch das Laden der Seite dauert länger, da viele HTTP-Requests parallel geöffnet werden. Eine Methode der Performance-Optimierung ist, HTTP-Requests möglich zu minimieren (zumindest bei HTTP 1.x).

        Aber hier geht es ja darum, das Memory-Limit und die Ausführungszeit des Scriptes pro Request zu verringern. Es ist besser, dass die Seite langsamer lädt und viele Server-Requests gemacht werden, als dass das Script das Memory-Limit (memory_limit) oder die maximale Ausführungszeit (max_execution_time) überschreitet.

        Den Zeitintervall würde ich durchaus hoch ansetzen, 10 Minuten reichen doch für die meisten Newsticker aus. Das ist ja nicht Twitter, es muss nicht in Echtzeit sein..

        Vronjobs wären halt gut, weil dann immer schon im Hintergrund die feeds geladen würden und man immer schon etwas vorfände, wenn man die Seite aufruft.

        Ja, klar, Cronjobs wären die bessere Alternative, die hier aber nicht zur Verfügung steht.

        Mathias