PHP Script: Apache Abfrage

djrick

Registered User
Hallo,

Ich werde in naher Zukunft ein größeres Webseiten Projekt in Angriff nehmen. Dafür sammele ich jetzt schon Informationen zusammen damit die Programmierung später schneller von der Hand geht.

Im Moment komme ich in einem Punkt nicht weiter:
Ich möchte ein Script basteln (vielleicht gibt es das auch schon) was folgendes Anzeigt:

Folgende Leute sind auf diesem Server unterwegs:

2 User bewegen sich gerade auf: www.domain1.de
1 User bewegt sich gerade auf www.domain2.de
3 User bewegen sich gerade auf sub.domain1.de

Quasi ein "Who's online" Script allerdings Serverweit. Vielleicht kann man da was mit mod_serverstatus basteln?
 
Brauchst es dir doch nicht so umständlich zu machen. Einfach ein Script bauen, was in eine Datenbank die Userinfos reinschreibt.. also welcher User um welche Zeit auf welcher Seite ist.
Das kannst du ja sogar so zurechtbauen, dass die User nicht mal auf dem gleichen Server sich bewegen müssen. Du speicherst die "who is online"-Records einfach zentral in einer Datenbank.

Oder habe ich dich missverstanden?
Aber so würde ich es angehen, bevor ich den Apachen auseinandernehmen würde.
Wenn du keine PHP-Dateien verwenden willst, sondern nur langweiliges HTML hast, kannst du es ja über die übliche "Bild-Methode" machen. Sprich ein Bild in die jeweilige Seite einbinden, was jedoch kein Bild, sondern eine PHP-Datei als Ursprung hat.

Noch mehr Denkanstöße? Dann nur melden ;)
 
Wenn's doch umständlich seien soll: http://bitbrook.de/software/mod_log_mysql/ (gubt leider noch keine Version für Apache 2.2, im zusammenspiel mit mod_dbd sollte das einfacher/besser gehn...)
Damit könntest du z.B. eine Tabelle erstellen wann welche IP auf welchem vHost das letzte mal aktiv war.
 
Last edited by a moderator:
server4downs said:
Oder habe ich dich missverstanden?
Das wäre eine Idee und auch total einfach ABER:
Das Script soll alle auf dem Server liegenden Homepages abfragen, da liegen auch Homepages drauf die
a.) Nicht von mir sind
b.) reine HTML Seiten sind
Folglich also auch kein "Whos Online" Script haben und ich kann ja schlecht jeden der bei mir gehostet ist, dazu zwingen sowas einzubauen :)
 
djrick said:
Folglich also auch kein "Whos Online" Script haben und ich kann ja schlecht jeden der bei mir gehostet ist, dazu zwingen sowas einzubauen :)
Da kann ich dir nun doch noch einen Tipp geben:
Du lässt HTML auch als PHP parsen (erst lesen bevor jetzt das Geschrei losgeht) und haust dein Script per auto_pre/append rein.
Kurz zur Performance-Streiterei wegen HTML als PHP:
Da kann ich dich beruhigen. Die ca. 20.000 vhosts die derzeit laufen verkraften das Parsen von HTML als PHP prima!
Die Prozessoren und der Ram machen das auch mit.
Glaub mir ;)
Wäre noch die einfachste Methode.
Was hälst du davon?
 
Nur ein paar Zwischenfragen:
[...]und haust dein Script per auto_pre/append rein.
Wie siehts dabei mit der Sicherheit aus? Das Script muß von php lesbar sein und damit sollte jeder User das Datenbankpasswort auslesen können (zumindest ohne Safe Mode bzw openbasedir)
Kurz zur Performance-Streiterei wegen HTML als PHP:
Da kann ich dich beruhigen. Die ca. 20.000 vhosts die derzeit laufen verkraften das Parsen von HTML als PHP prima!
Fast-CGI oder mod_php?
 
Hallo.
Mit dem Auslesen hast du allerdings Recht. Ist mir gerade erst eingefallen, da wir die Geschichte etwas anders lösen, bzw. keine Schreibrechte für MySQL brauchen. Aber da ließe sich sicher irgendwie was machen. Eventuell eine Javascript-Abfrage die dann was an ein Script weitergibt.
Sollte nicht so das Problem sein.

Fast-CGI oder mod_php?
Das wirst du jetzt nicht glauben, aber derzeit einfach PHP CGI mit suexec :D
Läuft bei uns so schnell wie bei 1&1. Die machen es nicht anders ;)
Also ohne jetzt Eigenwerbung zu betreiben muss ich sagen, dass der Space mit diesem Speed derzeit durchaus mit namhaften Webhostern (paid) mithalten kann.
 
In dem Script, welches du in allen Seiten per Preload rein nimmst, kansn du die SQL Zugangsdaten doch in eine Funktion kapseln und den DB Link wieder closen. Auf das Script bekommt nur der Webserver Leserechte.
Dazu OpenBasedir - solltest du bei mehreren Usern eh machen.

Dann kann eigentlich keiner die Zugangsdaten mehr auslesen.
 
Also irgendwie find ich beide Lösungen noch nicht so wirklich überzeugend da ich :
a) Keinen Bock hab den Apache neu zu kompilieren
b) keine Ahnung hab wie ich HTML als PHP Parse und ein Pre-Script reinbaue

Ich hatte eher ansowas gedacht die: /server-status auszulesen oder so...
 
Das wirst du jetzt nicht glauben, aber derzeit einfach PHP CGI mit suexec :D
Wenn man für jede Datei einen eigenen Prozess startet könnte man es auch mit einer Pipe in den Logs machen:
Code:
[url=http://httpd.apache.org/docs/2.0/mod/mod_log_config.html.en#customlog]CustomLog[/url] |/usr/bin/mysql "[i]mysql Befehle die %a und %t speichern[/i]"
Auf das Script bekommt nur der Webserver Leserechte.
Ich vermute einfach mal das das pre/postload Skript mit dem gleichen User wie das richtige Skript ausgeführt wird, also php bei suexec, suphp oder fastcgi das Script garnicht lesen...
/server-status auszulesen
Da steht ja nur drinnen wer zur Zeit eine Datei runterlädt, aber User seit x Sekunden nichts downloaden sondern nur lesen gelten meist auch noch als online. Außerdem ist es AFAIK performancelastig alle paar sekunden den Serverstatus abzurufen :(
Keinen Bock hab den Apache neu zu kompilieren
Dann halt http://www.outoforder.cc/projects/apache/mod_log_sql/
Da mußt du nur das Modul kompilieren und es gibt sogar fertige Packete für Debian. Nachteil ist das der MySQL Syntax vorgegeben ist und nicht(ohne Sourcecodemodifikation) für deine Bedürfnisse angepasst werden kann, d.h. die Abfrage wie viele User/IPs in den letzten x Sekunden aktiv waren dauert länger :(
 
Last edited by a moderator:
djrick said:
Also alles nicht das Wahre...
In der Annahme das sich das auf mod_log_sql bezieht:
Nur weil du keine Hochperformante Lösung ist kann es dennoch für deine Zwecke genügen. Die Daten werden in folgenden Tabelle gespeichert:
Code:
create table access_log (
	id char(19) ,
	agent varchar(255) ,
	bytes_sent int unsigned ,
	child_pid smallint unsigned,
	cookie varchar(255),
	machine_id varchar(25),
	request_file varchar(255),
	referer varchar(255) ,
	remote_host varchar(50) ,
	remote_logname varchar(50) ,
	remote_user varchar(50) ,
	request_duration smallint unsigned ,
	request_line varchar(255),
	request_method varchar(10) ,
	request_protocol varchar(10) ,
	request_time char(28),
	request_uri varchar(255),
	request_args varchar(255),
	server_port smallint unsigned,
	ssl_cipher varchar(25),
	ssl_keysize smallint unsigned,
	ssl_maxkeysize smallint unsigned,
	status smallint unsigned ,
	time_stamp int unsigned ,
	virtual_host varchar(255)
);
Es wäre natürlich schöner wenn remote_host(oder was du sonst zur Identifikation eines Besuchers verwenden willst) der primärer Schlüssel der Tabelle wäre aber wenn du von Zeit zu Zeit die veralteten Daten löscht sollte die Tabelle so handlich bleiben das die Abfragen schnell genug abgearbeitet werden.
 
djrick said:
Also alles nicht das Wahre...
Naja... wir rackern hier uns einen ab und du tust alle Mühe mit einem abwertenden Satz ab. Nicht gerade sehr schön.
Für solch ein Vorhaben musst du eben einfach ein wenig kreativer werden, anders gehts nicht.
Weitere Vorschläge/Lösungsansätze poste ich nur noch, wenn du ein wenig mehr Interesse zeigst. So ist mir die Zeit zu schade.
 
Back
Top