Webwurm: Zentraler Counter / Einbinden von Dateien von anderen Servern

Hallihallo,
ich habe folgendes Problem und ich hoffe, ihr könnt mir helfen:

Als Administrator von mehreren Internetseiten wollte ich einen zentralen Counter einrichten, also eine zentrale Datenbank, bei der bei Aufruf einer Seite immer ein Eintrag (welche Seite, IP, Zeitstempel) hinzukommt.

Die Idee war, direkt auf dem Webspace, auf dem die Datenbank liegt, ein .ASP-Skript zu schreiben, welches bei Aufruf den Datenbankeintrag übernimmt.

Dieses wollte ich dann auf der index.asp jeder Sites mit SSI einfügen, also mit #include virtual="http://..." .

Leider meint er aber, dass er die Datei nicht finden kann.

Hab auch #include file=.. probiert etc..., geht aber alles nix.

Kann ich mit dem include-Befehl nur lokale Dateien einfügen? Und wenn ja, wie könnte ich das Problem dann lösen????

Vielen Dank für Eure Hilfe,
Webwurm

  1. Halihallo Webwurm

    Die Idee war, direkt auf dem Webspace, auf dem die Datenbank liegt, ein .ASP-Skript zu schreiben, welches bei Aufruf den Datenbankeintrag übernimmt.

    Soweit OK.

    Dieses wollte ich dann auf der index.asp jeder Sites mit SSI einfügen, also mit #include virtual="http://..." .
    Leider meint er aber, dass er die Datei nicht finden kann.

    Klar.

    Kann ich mit dem include-Befehl nur lokale Dateien einfügen? Und wenn ja, wie könnte ich das Problem dann lösen????

    Deshalb. Ich würde es für absoluten Schwachsinn halten, wenn bei jedem Request auf die eigene Page eine Seite noch vom anderen Server erst eingelesen werden müsste. Die Antwortzeit des eigenen Servers würde hiermit wehement sinken.

    Bau lieber ein <img> - Tag in jede statistisch zu erfassende Page ein, wodurch du bei jedem Aufruf einen Request auf den Statistik-Server auslöst. Damit entfällt die Last auf den Nebenserver, welche ja auch gar nicht gebraucht wird.

    Viele Grüsse

    Philipp

    1. ah, vielen dank!
      noch ne frage: wie werte ich den aufruf durch einen <img>-tag in einer datenbank aus?
      lg, webwurm

      Halihallo Webwurm

      Die Idee war, direkt auf dem Webspace, auf dem die Datenbank liegt, ein .ASP-Skript zu schreiben, welches bei Aufruf den Datenbankeintrag übernimmt.

      Soweit OK.

      Dieses wollte ich dann auf der index.asp jeder Sites mit SSI einfügen, also mit #include virtual="http://..." .
      Leider meint er aber, dass er die Datei nicht finden kann.

      Klar.

      Kann ich mit dem include-Befehl nur lokale Dateien einfügen? Und wenn ja, wie könnte ich das Problem dann lösen????

      Deshalb. Ich würde es für absoluten Schwachsinn halten, wenn bei jedem Request auf die eigene Page eine Seite noch vom anderen Server erst eingelesen werden müsste. Die Antwortzeit des eigenen Servers würde hiermit wehement sinken.

      Bau lieber ein <img> - Tag in jede statistisch zu erfassende Page ein, wodurch du bei jedem Aufruf einen Request auf den Statistik-Server auslöst. Damit entfällt die Last auf den Nebenserver, welche ja auch gar nicht gebraucht wird.

      Viele Grüsse

      Philipp

      1. Halihallo webwurm

        ah, vielen dank!
        noch ne frage: wie werte ich den aufruf durch einen <img>-tag in einer datenbank aus?

        Ein Anruf durch ein img-Tag ist primär einmal _nichts_ anderes, als wenn das asp-Script über einen Link "gestartet" wird. Das <img src="..."> - Zeug braucht dich also gar nicht zu kümmern.
        Die Datenbank wertet gar nichts aus, sie speichert nur die ausgewerteten Daten, was auswertet ist und gleibt dein asp-Script.

        Eine Frage: Was willst du über den Tag für Daten auswerten, diese Frage solltest du dir an dieser Stelle stellen.

        Nehmen wir ein einfaches Beispiel: Pageviews und Visits. Ein Pageview ist ein Zugriff auf die Page, also indirekt auch ein und genau ein Zugriff auf das img-Tag. Du musst für Pageviews also nix anderes machen, als bei jedem Aufruf des img-Tags einen Counter zu incrementieren (um eins erhöhen). Bei Visits wird's etwas schwieriger, da du alle Pageviews, die innerhalb von, sagen wir, 30 Minuten vom selben User "ausgelöst" werden, zusammenzufassen zu 1. Du musst also verschiedene User "identifizieren". Dies lässt sich über einige Möglichkeiten realisieren (eg. Cookies oder Analyse der IP, UserAgent und Client-Settings Auswertungen, ...) jede hat ihre Vor- und Nachteile (Cookies kann man ein und abschalten, IP's sind bei weitem nicht unique/eindeutig [eg. wenn ganze Firmen über einen Proxi ins Netz kommen, haben alle User die selbe IP; oder die IP wechselt evtl. bei jedem neuen einloggen über das analog-Modem, ...]). Naja, aber wenn du nun ein Kriterium festgelegt hast, wie du unterschiedliche User "identifizieren" kannst, kannst du einfach bei jedem neuen "Visit-Datensatz" einen Wert in der DB incrementieren und jeder Pageview, der bereits einem "Visit-Datensatz" "zugewiesen" ist, wird ignoriert (da der User eben noch in derselben "Visitzeit" wiedergekommen ist).

        Du solltest dir zuerst die Frage stellen, was du denn gerne Auswerten würdest (es gibt ja genug Daten). Die zweite Frage ist das DB Design (die Datenstruktur gut und effizient sein). Die dritte Frage: Wieviele Requests wird auf das img-Tag ausgeführt? - Bei sehr grossen Zahlen, würde ich von der direkten Speicherung der Daten in der Datenbank abraten.

        Viele Grüsse

        Philipp

        1. vielen dank für deine mühe!

          in der aufzurufenden datei füge ich _nur_ einen datenbankeintrag in meine counter-db hinzu: mit einigen servervariablen, die url der site, um die es geht, sowie datum+uhrzeit.

          mit dem <img> hats jetzt auch funktioniert - allerdings nur ein mal.
          jetzt denke ich mir, dass ich vielleicht einige meta-tags setzten sollte:

          <%
          Response.Buffer=true
          Response.CacheControl = "no-cache"
          Response.AddHeader "Pragma", "no-cache"
          Response.Expires = -1
          %>

          das funktioniert aber leider trotzdem nicht. außerdem müsste ich den site-namen übergeben, also der <img>-tag würde so aussehen:

          <img src="http://.../bruken/adminarea/counter_increase.asp?ID=www.bruken.com" width="32" height="32">

          leider funktioniert das aber alles nicht.

          hilfe!
          webwurm

          1. Halihallo webwurm

            mit dem <img> hats jetzt auch funktioniert - allerdings nur ein mal.
            jetzt denke ich mir, dass ich vielleicht einige meta-tags setzten sollte:

            <%
            Response.Buffer=true
            Response.CacheControl = "no-cache"
            Response.AddHeader "Pragma", "no-cache"
            Response.Expires = -1
            %>

            Genau, das Browser-Caching _muss_ verhindert werden. Sollte so funktionieren.

            das funktioniert aber leider trotzdem nicht.

            Nun, wie hast du getestet? - Mit dem gleichen Browser, ohne eine neue Browsersession (ich könnte mir vorstellen, dass gewisse M$-Produkte ein Caching sogar dann ausführen, wenn sie es nicht sollten, vielleicht hilft da ein Neustart des Browsers was?). Zumindest habe ich schon einiges "komisches" mit M$ gesehen, was nicht sein dürfte.

            außerdem müsste ich den site-namen übergeben, also der <img>-tag würde so aussehen:

            Theoretisch könntest du auch den Referer auslesen. Optional mit der Angabe über die URL vergleichen und so "fehlerhafte" oder automatisch generierte Requests (eg. um Statistik künstlich hochzutreiben) nicht beachten.

            <img src="http://.../bruken/adminarea/counter_increase.asp?ID=www.bruken.com" width="32" height="32">
            leider funktioniert das aber alles nicht.

            Ich würde hier noch mit einer Timestamp auf Clientseite arbeiten. Hänge über JavaScript eine Timestamp an die URL an, dann kennt der Brwoser in jedem Fall die URL nicht und holt sie somit direkt vom Server ohne überhaupt cachen zu können. Aber: Nicht nachträglich durch JS ändern, sonst führt jeder Request zu zwei Requests auf das img-Tag (zumindest, wenn das img schon vorher geholt wurde, bevor das JS ausgeführt wurde)! - Also das <img>-Tag ganz durch JS generieren, optinal mit <noscript>-Tag, um Statistik auch bei deaktiviertem JS zu messen.

            Also etwa so:

            <script src="http://www.statserver.de/tag.js"></script>
            <noscript>
               <img src="http://www.statserver.de/statistik.asp?ID=...">
            </noscript>

            in tag.js hast du stehen:

            document.write( '<img src="http://www.statserver.de/statistik.asp?ID=...&r='+escape(Math.rand(1000000)) );

            weiss grad nicht ob's Math.rand gibt, einfach eine random-Zahl oder die Timestamp...

            Dann müsste es meiner Meinung nach fast nicht cachebar sein.

            Viele Grüsse

            Philipp

            1. johuu, ich hab den fehler!
              das javascript war gar nicht notwendig: der fehler - obwohl mir nicht ganz klar - lag in der auszuführenden .asp-datei. die sieht in etwa so aus:

              ...
              rsCounter.AddNew
              rsCounter("IP") = Request.ServerVariables("REMOTE_ADDR")
              rsCounter("Zeitstempel") = Now()
              rsCounter("Site") = Request.QueryString("Site")
              rsCounter("Remote_Addr") = Request.ServerVariables("REMOTE_ADDR")
              rsCounter("Remote_Host") = Request.ServerVariables("REMOTE_HOST")
              rsCounter("Http_accept_language") = Request.ServerVariables("HTTP_ACCEPT_LANGUAGE")
              rsCounter("Http_host") = Request.ServerVariables("HTTP_HOST")
              rsCounter("Http_referer") = Request.ServerVariables("HTTP_REFERER")
              rsCounter("Http_user_agent") = Request.ServerVariables("HTTP_USER_AGENT")
              rsCounter.update
              ...

              beim direkten aufrufen funktioniert die sache einwandfrei und ein datensatz wird hinzugefügt.
              sobald ich sie jedoch - wie von dir vorgeschlagen - über <img> aufrufe, wird nichts mehr hinzugefügt. nach einigem experimentieren entdeckte ich folgendes:

              nach dem löschen der zeilen
              rsCounter("Http_referer") = Request.ServerVariables("HTTP_REFERER")
              und
              rsCounter("Http_user_agent") = Request.ServerVariables("HTTP_USER_AGENT")
              funktioniert die sache wieder.

              ich weiß zwar nicht wieso, aber es geht...