SEO-Software von Suchmaschinenoptimierung.de

Problem

(hier klicken, um zum Original Thread zu gelangen)
TrioxX
Hiho,

der Titel sagt eigentlich nichts über mein Problem aus. Also versuche ich, es verständlich rüber zu bringen ^^

Ich habe eine Tabelle mit Usernamen und ID's. Während des Aufrufs einer PHP Datei werden diese Daten aus der Datenbank gelesen und ausgegeben. Vor der Ausgabe wird eine URL aufgerufen, die sich wie folgt zusammensetzt:

http://www.example.com/status.php?nick=$username

Soweit, so gut. Die oben aufgerufene status.php gibt zurück "Online" oder "Offline". Auch gut. Funktioniert alles tadellos. Jedoch folgendes:

Man kann die Liste nach Namen sortieren. Ich benutze für die Seitennavigation folgendes Snippet:

http://www.php-einfach.de/tuts_mysql_blaetterfunktion.php

Nun möchte ich das Ganze erweitern. Und zwar möchte ich auch bei Möglichkeit nach Status, also Online/Offline sortieren lassen. Da die Prüfung aber erst nach dem SQL-Query stattfindet, geht das eigentlich nicht.

Ich schätze aber, dass es da doch einen Trick gibt. Und deswegen frag ich mal hier smile

Theoretisch könnte ich es so machen, dass ich erst alle Mitglieder auslese und dann den Status. Beide werte packe ich in ein Array und lasse ds sortieren. Das sollte aber nicht Sinn der Übung sein und würde auch die ganze Vorarbeit zur Nichte machen. Zudem wäre eine Abfrage der Seite ewig lang, weil es so viel zu tun gäbe...

Eine Idee wäre, den Status aller User alle 5 Minuten zu prüfen und die Rückgabe in die Datenbank zu übergeben mittels Update. Aber das muss doch weniger umständlich gehen. Oder?

Also... Wer hat einen Rat? smile
moonsword
der status muss doch irgendwie abgespeichert sein....warum fragst du den status überhaupt so kompliziert ab? ist der auf einer anderen seiten? oder was?
erzähl mal...warum holst du dir den status nicht direkt mit aus der db?
wenn es extern ist, dann wirst du um ein array oder so ein ständiges update nicht drumrum...wobei da natürlich das sortieren bei einer relativ geringen userzahl, mit einem guten algo vorteilhafter wäre.
TrioxX
Das ist das Problem Augenzwinkern Der Status wird von extern abgefragt.
KrickelD
Leider fallen mir auch nur die zwei Lösungswege ein:

Array
Vorher die Daten aus DB ins Arary holen, Status abfragen und ins Array packen, sortieren, ausgeben

Cronjob
Daten regelmäßig abfragen und in die DB schreiben, dann kannst du es direkt ausgeben

Jetzt muss man abwegen, welcher Weg mehr Sinn macht... Wird deine Seite sehr häufig aufgerufen dann würde der Cronjob Sinn machen um beide Server nicht so zu belasten. Wenn es nicht häufig genutzt wird dann lohnt sich die Abfrage alle 5 Minuten nicht da die Daten ja eh nicht genutzt werden. Also kann man den anderen Server auch schonen smile
brainnrg
Idee:

Du solltest, falls noch nicht so gemacht, beim User einen Timestamp anlegen wann er das letzte mal Aktiv war. Das ist glaube ich eh standard für eine Online/Offline Abfrage.

Nun könntest du doch deinen Query so erweitern das er dir gelich Online/Offline im Query abfragt.
Das geht mittels IF in MySQL. Die Zeit wie lange ein user als Online gilt seit seinem letzten aktiven Ereignis (hier last_logtime) kannst du auch festlegen (hier 600).

Das wars eigentlich auch schon, nun solltest auch nach online/offline sortieren können.


Mein Vorschlag für den MySQL Query
code:
1:
2:
3:
4:
5:
SELECT * , IF( (
UNIX_TIMESTAMP( NOW( ) ) -600 ) < UNIX_TIMESTAMP( last_logtime ) , 1, 0
) AS online
FROM users
ORDER BY online DESC


Erklärung:
600 ist die Zeit die ein User als Online zählt in Sekunden.


EDIT: Habe gelesen das irgendwie du den Status nur von extern bekommst.
Hier würde ich raten falls du keinen Zugriff auf die externe DB hast das mittels Cronjob zu machen. Das ist die eleganteste Lösung.
Wieso?
Hast du 100 User die du Abfragen willst müssten 100 Verbindungen bei jedem Seitenaufruf gemacht werden. Das lahmt, der User muss lange auf den Seitenaufbau warten und das beste für die Serverlast ist das auch nicht.

Also Cronjob, Script das alle User abfrägt erstellen, irgendwie speichern (XML, nutzen von serialize() und speichern in Textdatei).
Bei deinem Aufruf dann zuerst User auslesen, dann die gespeicherten Online/Offline Ergebnisse auslesen, zusammenführen in Array und mit array_multisort arbeiten.

MFG
KrickelD
wenn es sich allerdings um 5 bis 10 user handelt dann lohnt sich die cronjob-geschichte nicht smile

Cronjob
und auch hier wieder: warum so kompliziert?

der job greift für alle user den on- und offline-status ab. anschließend wird ein update-befehl auf die datenbank gejagt, zum beispiel schritt 1 alle auf offline setzen, schritt 2 die updaten welche zuvor als online erkannt wurden. sind also nur 2 update-befehle und es steht immer der echte wert in der DB

bei der ausgabe kann dann immer ein relativ aktueller wert genutzt werden
moonsword
andere frage: warum ein cronjob....wenn man abspeichert, wann das letzte update war...und dann immer nur das update ausführt, wenn es benötigt wird...d.h. status wird abgefragt, updatet die db...status wird nach 3min abgefragt, er holt es sich aus der db....wenn 5min überschrittet, macht er halt wieder ein update...dann könnte es sein, dass er manchmal schneller und manchmal langsamer ist, aber du hast keinen ständigen traffic alle 5min smile
musst dir halt das ergebnis in einer db cachen, aber das sollte ja nicht das problem sein.
TrioxX
Also derzeit muss ich 6099 User abfragen und deren Status alle 5 Minuten aktualisieren.

Die Möglichkeit des Cronjobs war die einzige, die mir auch eingefallen ist.
brainnrg
Jo, beste Möglichkeit is Cronjob, das ist meine Meinung.

6099 User "im Live" abrufen und aktualisieren ist einfach nix, solange du für jeden User eine externe URL aufrufen musst.

Im Cronjob wie KrickelD sagte kannst gleich in deiner DB speicher ob Online oder offline.

Das ist meiner Meinung die beste Lösung.

EDIT: Oder bei der Ausgabe der Usertabelle die Daten direkt via AJAX holen. PHP Script bauen als Proxy (anders ist es dir nicht erlaubt externe URLs einzubinden, ausser Dynamic Script Tag was nur bei JSON Rückgabe sauber funktioniert) und abfragen.

MFG
moonsword
Zitat:
Original von brainnrg
Jo, beste Möglichkeit is Cronjob, das ist meine Meinung.

6099 User "im Live" abrufen und aktualisieren ist einfach nix, solange du für jeden User eine externe URL aufrufen musst.

Im Cronjob wie KrickelD sagte kannst gleich in deiner DB speicher ob Online oder offline.

Das ist meiner Meinung die beste Lösung.

EDIT: Oder bei der Ausgabe der Usertabelle die Daten direkt via AJAX holen. PHP Script bauen als Proxy (anders ist es dir nicht erlaubt externe URLs einzubinden, ausser Dynamic Script Tag was nur bei JSON Rückgabe sauber funktioniert) und abfragen.

MFG

wenn du sie über ajax holst, musst du sie auch über js sortieren..ist zwar möglich aber total unpraktikabel...ich hab von einer live lösung geredet, die ein zwischending ist....wenn du natürlich aber den status ab und an sowieso noch woanders brauchst...dann ist das mit dem cronjob die besten lösung smile
noch eine möglichkeit wäre halt, wenn du zugriff auf den anderen server hast, mysql für einen bestimmten user nach aussen hin frei zu geben und sich dann mit dem user verbinden...das sollte eigentlich auch gehen.
TrioxX
Ich mache es jetzt gut bürgerlich: Alle 30 Minuten per Cronjob den Status abfragen und die Tabellen aktualisieren.

So kann man dann nach Status sortieren. Der livestatus wird dann dennoch abgefragt. Das ist zwar nicht die perfekteste, aber mitunter die einfachste Lösung.
(hier klicken, um zum Original Thread zu gelangen)



Tipp: Ranking-Konzept.de - Das SEO-Forum (Forum rund um die Suchmaschinenoptimierung) der artaxo AG.
Das große Versicherungs ABC von Versicherung.de - mit allen Aspekten der Computerversicherungen!
Fan-Foren.de, die große Community mit Musikforum ist ab sofort online.