Caching - Problem mit file-Funktion

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Caching - Problem mit file-Funktion

    Hallo,

    ich habe mit dem Cachen einiger (dynamischer) Seiten Probleme.
    Um das Prinzip zu verstehen, werde ich es kurz erläutern:

    Meine Seiten brauchen ewig lange, bis sie sich aufbauen, da ich verschiedene Abfragen dynamisch erledige. Die Abfragen lassen sich mMn nicht weiter optimieren, da sie für die Distanzberechnung zweier Postleitzahlen benötigt werden.

    Als Lösung dachte ich mir: "Okay, dann werden diese Seiten halt gecached" - gesagt, getan:
    Ich habe vor und nach dem dynamischen Inhalt einer jeden Seite so etwas stehen: (Start, Ende)

    PHP-Code:
    HeaderSidebar usw...
    {
    _START_}
    dynInhalt
    {_ENDE_}
    Footer usw
    Um nun den dynamischen Inhalt auszulesen und als String zu bekommen, habe ich folgende Zeilen geschrieben:

    PHP-Code:
    if(file_exists("/var/www/web2/html/site_cache/".$kategorie_url.$rubrik_url.$subrubrik_url.$datum."_in_".$city['url'].$page.".html")) {
    unlink("/var/www/web3/html/site_cache/".$kategorie_url.$rubrik_url.$subrubrik_url.$datum."_in_".$city['url'].$page.".html");
    }
    $content implode(""file($domain."de/cc/".$kategorie_url."_in_".$city['url']."/".$rubrik_url."/".$subrubrik_url.$add.$page.".html"));
    $a explode("<!--{_START_}-->\n"$content);
    $content $a[1];
    $b explode("<!--{_ENDE_}-->\n"$content);
    $content $b[0];
    $fh fopen("/var/www/web3/html/site_cache/".$kategorie_url.$rubrik_url.$subrubrik_url.$datum."_in_".$city['url'].$page.".html""w");
    fputs($fh$content);
    fclose($fh);

    if(
    file_exists("/var/www/web3/html/site_cache/".$kategorie_url.$rubrik_url.$subrubrik_url.$gestern."_in_".$city['url'].$page.".html"))

    unlink("/var/www/web3/html/site_cache/".$kategorie_url.$rubrik_url.$subrubrik_url.$gestern."_in_".$city['url'].$page.".html"); 
    Das Ganze befindet sich in mehreren Schleifen, um für jede Kategorie, Rubrik, Subrubrik die passenden Seiten zu erzeugen.

    Eine URL kann dann z.B. so aussehen ...de/cc/Kategorie1_in_Berlin/RubrikXY_Seitenzahl.htm
    (Seitenzahl = Platzhalter)

    Die dynamischen Inhalte oder auch Strings werden dann im Ordner /site_cache/ erzeugt und alte Daten gelöscht.

    Mein Problem ist nun folgendes:
    Nach etwas 3-4 Stunden CronJob (dieses Script) bekomme ich nur noch 404-Meldungen:

    Code:
    Warning:
    file(http://www.xyz.de/de/cc/Kategorie1_in_Duisburg/Rubrik_26.html):
    failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
    in /var/www/web3/html/umkreis/cron3b.php on line 391
    
    Warning: implode(): Invalid arguments passed in
    /var/www/web3/html/umkreis/cron3b.php on line 391
    Das Ganze wiederholt sich dann und er gibt mir keine Inhalte mehr.
    Die Funktion file() bekommt einfach keine Ergebnisse mehr zustande.

    Das komische ist, dass es für ca. 100 Rubriken in jeweiligen Kategorien funktioniert. Das o.g. Beispiel mit Duisburg hat 44 Seiten, davon werden die ersten 25 ERZEUGT!!!, nur ab Seite 26 gibts dann keine Ergebnisse.

    Achja, die Seiten lassen sich bei mir im Browser aufrufen! Sie existieren also bzw. die RewriteRules funktionieren und die Ergebnisse sind nicht leer.


    Ich danke euch schon jetzt im Voraus für jeden Tipp, den Ihr mir geben könnt - bin echt am verzweifeln!

  • #2
    Ich würde mal schwer darauf tippen, dass hier ein Mechanismus greift, der zu häufige und schnelle Zugriffe des gleichen Client unterbindet.
    Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
    Schön - etwas Geschichte kann ja nicht schaden.
    Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

    Kommentar


    • #3
      Vielen Dank für die schnelle Antwort!

      Gibt es denn eine Möglichkeit diesen Mechanismus zu identifizieren und ggf. zu deaktivieren?
      Oder gibt es eine Alternative um den Mechanismus zu umgehen?

      Es muss ja irgendwie möglich sein, Seiten abzufragen, die existieren!
      Vielleicht mit try-catch und dann 10 Wiederholungen?
      Timeout greift hier nicht oder?

      Folgendes steht am Anfang der Datei:
      PHP-Code:
          ini_set('memory_limit''128M');
           
      ini_set("default_socket_timeout"240); // 4 Minuten!!! 
      sonst bekomme ich die Meldung "memory exhausted"...

      Vielen Dank!

      Kommentar


      • #4
        Grad mal noch eine andere Frage: Rufst du hier Seiten auf, die sich eh auf dem gleichen Server befinden?
        Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
        Schön - etwas Geschichte kann ja nicht schaden.
        Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

        Kommentar


        • #5
          Genau, die Seiten, die ich abfrage, befinden sich auf demselben Server!

          Kommentar


          • #6
            Warum speicherst du sie dann nicht gleich, wenn sie erstellt werden? Ist ja sonst ein bisschen von hinten durch die Brust ins Auge...
            Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
            Schön - etwas Geschichte kann ja nicht schaden.
            Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

            Kommentar


            • #7
              Die Seiten sind alle dynamisch. Also ich habe URLs, die durch mod_rewrite als Parameter an die betreffende PHP-Datei umgeleitet werden.

              Der Aufbau der dynamischen Seiten kann schon mal eine Minute dauern. Und da das halt nicht infrage kommt, muss ich jede Seite einzeln erstellen und abspeichern, damit alle Möglichkeiten (durch Parameter) schon existieren und bereitstehen.

              (Mit den Seiten, die er ermitteln konnte funktioniert das auch alles wunderbar. Also die Seiten bauen sich innerhalb von millisekunden auf, weil sie halt schon existieren. Nur wie bekomme ich die anderen Seiten erzeugt, ohne dass er mir 'nen 404 ausgibt?!)

              LG

              Kommentar


              • #8
                Eine Minute um die Distanz zwischen zwei PLZ zu berechnen? Da hast du irgendwo einen schönen Haken in deiner Programmierung würd ich mal sagen.

                Zum anderen:
                Ich meinte ja, du solltest das Ergebnis, dass dir dein PHP-Script ausgibt eben auch gleich im PHP-Skript speichern.

                1. Irgendein Client ruft /de/cc/Kategorie1_in_Duisburg/Rubrik_26.html auf deinem Server auf
                2. mod_rewrite übergibt das ganze an dein Script xyz.php
                3. Script xyz.php erstellt den entsprechenden Inhalt, gibt in an den Client zurück und speichert den Inhalt auch gleich

                Damit würdest du dir die Cronjob-Geschichte sparen.


                Mit deinem Weg:
                Versuche es mit kleinen Pausen zwischen den Seitenaufrufen oder lasse pro Cronjob-Durchgang immer nur eine gewisse Anzahl an Seiten generiern.
                Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                Schön - etwas Geschichte kann ja nicht schaden.
                Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                Kommentar


                • #9
                  2 Postleitzahlen werden in der Funktion berechnet. Dieses wird aber für etwa 12.000!!! Profile durchgeführt (zu über 20 Städten!!!). Abhängig vom Abstand.

                  Die Geschichte besteht aus 3 CronJobs:
                  1 - der erste Speichert den Abstand von ProfilPLZX zu StadtPLZY. Für alle Kategorien, Rubriken und Subrubriken.
                  2 - hier wird eine 2. Tabelle angelegt, die zu jeder Stadt und Kategorie bzw. Stadt und Rubrik bzw. Stadt und Subrubrik alle Profile enthält, bei denen der Abstand unter einem gewissen (fixen) Radius liegt. Der Wert des Abstandes wird ebenfalls in der Tabelle gespeichert.
                  3 - erst die letzte Datei geht alles durch und erzeugt die Seiten.

                  Würde ich es so machen wie Du vorschlägst (Seiten live erstellen und cachen), würden die ersten Besucher pro Tag minutenlang darauf warten, dass sich eine bestimmte Seite aufbaut.

                  Die Idee finde ich gut, aber leider darf ich das unseren Besuchern nicht antun.

                  PS: Die Berechnung eines einfachen Abstandes zwischen 2 PLZ geht recht schnell mit der Open-GEO-DB. (einige Millisekunden) Jedoch muss dies halt für über 12.000 Profile zu den vorhandenen (über 20) Städten vorgenommen werden!

                  Kommentar


                  • #10
                    Also wenn du /de/cc/Kategorie1_in_Duisburg/Rubrik_26.html aufrufst, dann werden da erstmal tausende von Abstandsberechnungen durchgeführt, oder wie?
                    Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                    Schön - etwas Geschichte kann ja nicht schaden.
                    Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                    Kommentar


                    • #11
                      Richtig. Abhängig von den Parametern. (Deswegen die Stadt in der URL)

                      Kommentar


                      • #12
                        Und auf der Seite werden dann auch sämtliche Ergebnisse aus den Abstandsberechnungen ausgegeben? Mir erschließt sich der Sinn der Sache nicht - deshalb die Nachfrage.
                        Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                        Schön - etwas Geschichte kann ja nicht schaden.
                        Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                        Kommentar


                        • #13
                          Nein, es werden nur die Profile mitgezählt, die bei denen der Abstand unter 200km liegt. Daher brauche ich den Wert.

                          Es wird die Anzahl der Profile einer Rubrik, bei denen der Abstand im Radius einer Stadt liegt, angezeigt.

                          z.B.:
                          RubrikXYZ in Berlin (123)
                          RubrikZYX in Berlin (321)
                          usw.

                          --------------------------------------------------------------------------------------
                          Macht es einen Unterschied wenn ich in der cron.sh 3 Dateien angebe statt nur die eine. Also eine für Kategorien, eine für die Rubriken und für die Unterrubriken. Sodass er diese nach und nach abarbeitet und nicht in einem Script?

                          Was meintest Du mit Pausen? Gibt es eine delay-Funktion, mit der das klappt?

                          Vielen Dank für Deine Hilfe

                          Kommentar


                          • #14
                            Also eine Umkreissuche? Dann steigst du aber von der falschen Seite auf das Pferd auf.

                            Da php.net grad down ist:
                            PHP - sleep - Sonstige-Funktionen
                            Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                            Schön - etwas Geschichte kann ja nicht schaden.
                            Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                            Kommentar


                            • #15
                              Jop, im Prinzip eine Umkreissuche.

                              Wie würdest Du denn an das Problem rangehen? Wenn ich mal fragen darf

                              Danke für die Info mit dem sleep. Ist ja wie damals mit QBasic ^^

                              Kommentar

                              Lädt...
                              X