Linuchs: Seiten zu langsam - umorientieren auf Objekte ?

Hallo,

es geht um meinen Veranstaltungskalender www.remso.eu - ich brauche ein neues, schnelleres Konzept und denke an Objekte. Erstmal die Beschreibung des Problems, dann weiter unten die Frage.

Problembeschreibung
-------------------
Die Durchlaufzeiten der PHP-Programme werden immer größer. Es liegt vermutlich an den unzähligen parallelen Aufrufen von Bots. Die Startseite dauert mal 0,2, mal 1,0 sec. Es waren mal 0,02 sec. Bei monatlich 20.000 Aufrufen sind das 10.000 sec = 166 min = knapp 3 Std. Nur für eine einzige Seite.

Da muss ich die Reißleine ziehen. Bisher ermiittle ich die Daten auf dieser Seite
* zuletzt eingegebene Events
* heutige Events
* Top 10 Themen
* Top 10 Orte
bei jedem Aufruf frisch aus der Datenbank. Das wäre aber nicht nötig. Die "heutigen Events" etwa sind 24 Std. unverändert. Falls da jemand für heute eine neue Meldung macht, kann das ignoriert werden.

So, nun wie? Ich denke daran, eine CSV-Datei anzulegen mit den heutigen Events. Im Programm kurz fragen, ob die Datei vorhanden und vom heutigen Tag ist. Wenn ja, kein DB-Zugriff, sondern die Datei nehmen. Besser noch als aufbereiteter HTML-Baustein.

Das kann prinzipiell auch für tausend andere Seiten gemacht werden. Da gibt es
* 68 Veranstalter mikt Events,
* 225 Städte mit Events,
* 30 Themen mit Events

jeweils mit diversen Parametern, etwa Datum von bis, Entfernung in km und so weiter.

Bei Google finde ich die schrägsten Kombinationen, die eigentlich nur per manueller Eingabe zustande gekommen sein können. Allein die Suche nach "remso.eu" bremen gibt Ungefähr 1.840 Ergebnisse, "remso.eu" hamburg 5.620.

Zahlreiche Schaumschläger-Seiten kennen remso, die müssen doch auch zugreifen.

Und nein, aufgelaufene vergangene Termine sind das - zumindest bei Google - nicht. Die lösche ich nämlich und melde bei Aufruf header("HTTP/1.0 410 Gone");

Frage
-----
Ich habe bisher keine Objekte. Was genau ist eigentlich ein Objekt? Können die heutigen Termine ein Objekt sein, das ich ins PHP-Programm einbinde? Und wo werden die Daten dieses Objekts gespeichert?

Oder ist es "nur" so, dass ein Objekt mit Programmende stirbt?

Ich weiss auch noch nicht recht, wie ich Bot-Zugriffe und von Menschen verursachte Zugriffe unterscheiden kann. Wenn ein Mensch Brunsbüttel +32 km sehen will, soll er das bekommen. Aber alle Bots haben gefälligst mit dem Standard 20 km zurechtzukommen. Und solche Daten haben auch einige Stunden Gültigkeit.

Klar, ein Mensch, der neue Events eingibt, will die auf den Listen sehen. Die Anzahl der Eingaben pro Tag sind überschaubar von 0 .. 50. Da könnten bei Eingabe ja die Objekte aktualisiert werden.

Linuchs

  1. Mahlzeit,

    ich hab deinen Post nur überflogen, aber bevor zu alles umbaust, lass erstmal nen Profiler drüberlaufen, dann kannst du Flaschenhälse erkennen.
    Diese kannst du dann gezielt beheben.

    --
    eigentlich ist mir bewusst, dass ich hin und wieder einfach mal die Klappe halten sollte. Doch genau in den unpassendsten Momenten erwische ich mich dabei, wie ich dennoch etwas sage ...
  2. Tach!

    Die Durchlaufzeiten der PHP-Programme werden immer größer. Es liegt vermutlich an den unzähligen parallelen Aufrufen von Bots.

    Vermutungen helfen bei real existierenden Problemen nur selten. Vor allem dann nicht, wenn man sie nicht durch Analysen des Systems (hier der Logfiles) auf Richtigkeit kontrolliert. Jeder Optimierungsversuch muss mit Messungen unter realistischen Bedingungen vorher und nachher auf Erfolg geprüft werden. Das ist kein Theman, das man mal einfach so angehen kann und auch keins, dass umfassend in einem Forum gelöst werden kann.

    Bisher ermiittle ich die Daten auf dieser Seite [...] bei jedem Aufruf frisch aus der Datenbank. Das wäre aber nicht nötig.
    So, nun wie? Ich denke daran, eine CSV-Datei anzulegen mit den heutigen Events.

    Ach, hast du bereits durch Messungen herausgefunden, dass der Flaschenhals die Datenbank ist? Hast du bei der den Query-Cache ausgeschaltet oder sendest du jedes Mal unterschiedliche Anfragen, so dass dieser nicht genutzt werden kann? Hast du ausgeschlossen, dass Indexe nicht passend zur Abfrage gesetzt sind und damit nicht verwendet werden können?

    Im Programm kurz fragen, ob die Datei vorhanden und vom heutigen Tag ist. Wenn ja, kein DB-Zugriff, sondern die Datei nehmen. Besser noch als aufbereiteter HTML-Baustein.

    Fertig generiertes HTML ist schon eher ein Punkt, der Rechenzeit spart. Auch das musst du mal messen.

    Ich habe bisher keine Objekte. Was genau ist eigentlich ein Objekt? Können die heutigen Termine ein Objekt sein, das ich ins PHP-Programm einbinde? Und wo werden die Daten dieses Objekts gespeichert?
    Oder ist es "nur" so, dass ein Objekt mit Programmende stirbt?

    Objekte sind auch nur eine andere Form von Variablen. Sie sind genauso vergänglich wie String-, Integer- oder Array-Variablen. Eventuell kommst du, was die Performance angeht, vom Regen in die Traufe, besonders wenn du noch gar keine Ahnung darüber hast. Objektorientiert ist eine Programmierphilosophie, vorwiegend um den Code besser strukturieren zu können.

    Ich weiss auch noch nicht recht, wie ich Bot-Zugriffe und von Menschen verursachte Zugriffe unterscheiden kann. Wenn ein Mensch Brunsbüttel +32 km sehen will, soll er das bekommen. Aber alle Bots haben gefälligst mit dem Standard 20 km zurechtzukommen. Und solche Daten haben auch einige Stunden Gültigkeit.

    Ein Bot, der was anderes zu sehen bekommt als deine Besucher, kann das als Betrug werten. Über die Google-Webmaster-Tools kannst du aber angeben, welche Kombinationen von Queryparametern nicht indexiert werden sollen. Wenn du mit dem Google-Bot arbeiten möchtest und nicht gegen ihn, solltest du die von Google bereitgestellten Informationen kennen und berücksichtigen.

    dedlfix.

    1. Ein Bot, der was anderes zu sehen bekommt als deine Besucher, kann das als Betrug werten.

      Sorry, wer verarscht hier wen?

      Gib bei Google mal ein die zwei Worte remso bremen.

      Auf Seite 2 wird dieser schwachsinnige Link angeboten:
      http://www.google.de/url?url=http://remso.org/%3FLO%3D0%26ORT%3D5734%26KM%3D173%26lg%3Dpl&rct=j&q=&esrc=s&sa=U&ei=wZh7VI3rLczeatDAgbAG&ved=0CB8QFjACOAo&usg=AFQjCNExVbKbZXT1Z6blCHOlx7P8Q8mCsg

      Schau dir bitte den Quellcode der Seite an, du findest
      <link rel="canonical"                href="http://remso.eu/?ORT=5734">

      und nichts mit 173 km und polnischer Sprache.

      Linuchs

      1. Ein Bot, der was anderes zu sehen bekommt als deine Besucher, kann das als Betrug werten.

        Sorry, wer verarscht hier wen?

        Niemand niemanden. Es ist seit etlichen Jahren bekannt, dass Suchmaschinen es nicht leiden können, unter ein- und derselben URL unterschiedliche Inhalte vorgesetzt zu bekommen, je nachdem, als welche Software sie sich identifizieren.

        Gib bei Google mal ein die zwei Worte remso bremen.

        Auf Seite 2 wird dieser schwachsinnige Link angeboten:
        http://www.google.de/url?url=http://remso.org/%3FLO%3D0%26ORT%3D5734%26KM%3D173%26lg%3Dpl&rct=j&q=&esrc=s&sa=U&ei=wZh7VI3rLczeatDAgbAG&ved=0CB8QFjACOAo&usg=AFQjCNExVbKbZXT1Z6blCHOlx7P8Q8mCsg

        Schau dir bitte den Quellcode der Seite an, du findest
        <link rel="canonical"                href="http://remso.eu/?ORT=5734">

        und nichts mit 173 km und polnischer Sprache.

        Mir fällt da als Erstes die Frage ein, warum du als Vorgabe-URL jene einer Seite angibst, die eine gänzlich andere Sprache anzeigt (und Umgebung obendrein). Und weil Google ja allwissend™ ist, hat Google sich das bestimmt auch gedacht und entschieden, dass du deine Seiten nicht so ganz im Griff hast und deine, für die meisten Polen irreführende canonical-Angabe ignoriert.

  3. Hi,
    ich hab auch nicht alles durchgelesen ;-)

    .. Das wäre aber nicht nötig. Die "heutigen Events" etwa sind 24 Std. unverändert. Falls da jemand für heute eine neue Meldung macht, kann das ignoriert werden.

    wenn sich die Seite nur ab und zu ändert, könntest du bei Änderung eine Seite generieren und als fixe index.html speichern.
    damit müsste der Server nicht mehr rechnen, sondern liefert nur html aus.

    Viele Grüße aus LA

    --
    ralphi
  4. Da muss ich die Reißleine ziehen. Bisher ermiittle ich die Daten auf dieser Seite
    * zuletzt eingegebene Events
    * heutige Events
    * Top 10 Themen
    * Top 10 Orte
    bei jedem Aufruf frisch aus der Datenbank. Das wäre aber nicht nötig.

    Ist es auch nicht.

    An Deiner Stelle würde ich

    * zuletzt eingegebene Events
    * heutige Events
    * Top 10 Themen
    * Top 10 Orte

    "HTML-Sniplets" speichern, diese bei Änderungen im jeweiligen Bereich löschen und beim ersten Aufruf neu ablegen. Das nimmt bei quasistatischen Inhalten gewaltig Last vom Server.

    Jörg Reinholz

    1. Hallo Jörg,

      "HTML-Sniplets" speichern, diese bei Änderungen im jeweiligen Bereich löschen und beim ersten Aufruf neu ablegen. Das nimmt bei quasistatischen Inhalten gewaltig Last vom Server.

      Gute Idee, teste ich gerade.

      Linuchs

  5. Oberste Zeile

    Warning: fopen(_text/snippet_neuerfassungen.htm): failed to open stream: Permission denied in /home/osmer/domains/remso.de/public_html/500/p590.php on line 1608

    Webserver

    Alle Bots die die Seite betreten dürfen, artgerecht mit Informationen füttern.
    Die Bandbreite eventuell für Bots drosseln. Allen unerwünschten Bots einen 404 senden.
    Spart erheblich Resourcen bei meinen Seiten.

    Cachen, cachen, cachen.

    Eventuell ESI (Edge Side Includes) sich ansehen.

    Ein Speedtest zeigt auch noch an, was man so noch alles optimieren kann.
    z.B.:
    Ihre Seite enthält 1 blockierende Skript-Ressourcen und 2 blockierende CSS-Ressourcen. Dies verursacht eine Verzögerung beim Rendern Ihrer Seite.

    Die Antwortszeit des Servers lag bei 0,38 Sekunden. Da geht bestimmt noch was.