anpera.net
https://anpera.dyndns.org/phpbb3/

Wer-war-da-Anzeige
https://anpera.dyndns.org/phpbb3/viewtopic.php?f=34&t=4173
Seite 1 von 2

Autor:  Song Sinen [ Sa 08 Dez, 2007 12:08 ]
Betreff des Beitrags:  Wer-war-da-Anzeige

Hallo!

Ich würde euch gerne das im Titel beschriebene Mod hier präsentieren doch leider war mein Kampf mit der date-function und einige andere Versuche das ganze zu lösen nicht erfolgreich.

-> Alle meine Methoden brauchten 2-4 neue Felder in der accounts-table und es wurde bei jedem Aufruf der common was aktualisiert. (= Für die Performance nich tragbar) Darum will ich fragen ob es nicht jemand anderes in dieser Gedankenschmiede versuchen könnte, vl. mit einem besseren Weg.

Es geht um eine Erweiterung der Online-Anzeige in der common, unter den Online-Helden soll ein weiterer Punkt stehen: "Zuletzt gesehen". Darunter werden dann alle User aufgelistet dich nicht online sind aber sich inerhalb der letzten 2 Stunden ausgelogt haben / ausgelogt wurden und hinter dem Namen die Zeit.

Ein Beispiel:
$this->bbcode_second_pass_code('', '2 Helden:
Bauernjunge Kashew
Bauernmädchen Lorn

0 Rpg-Helden:
Keine Rpg-Helden da

0 Moderatoren:
Keine Moderatoren da

Zuletzt gesehen:
Bauernjunge Lung (vor 20 min)
Ritter Harlew (vor 1 Stunde, 15 min)')

Ich bin sicher es gibt eine einfache, elegante Lösung mit der date-function, den Feldern login, dem timeout etc.. Leider hab ich sie nicht finden können. 8/

Autor:  Harthas [ Sa 08 Dez, 2007 12:13 ]
Betreff des Beitrags: 

Was wäre, wenn du es einfach in der setnewday.php jeweils aktualisieren lässt?
So könnte man auch das Query pro Klick weglassen.

Was date() anbelangt, kann ich gerade auch nicht gross weiterhelfen, bin selbst auch nicht wirklich begabt auf diesem Gebiet ;-)

Autor:  Eliwood [ Sa 08 Dez, 2007 12:55 ]
Betreff des Beitrags: 

Ja, das geht tatsächlich einfacher:

$this->bbcode_second_pass_code('', 'SELECT
`name`, `superuser`, `laston`
FROM
`accounts`
WHERE
`locked` = 0 AND
`loggedin` = 1 AND
`laston`>"'.date("Y-m-d H:i:s",strtotime("-2 hours")).'"
ORDER BY
`level` DESC, `acctid` ASC')

Müsste theoretisch funktionieren.

Autor:  Nightborn [ Sa 08 Dez, 2007 16:58 ]
Betreff des Beitrags: 

Richtig.

Wäre aber immer noch eine query auf die gesamte Accounts Tabelle mehr je Hit auf der Index.

Ich würde das noch cachen daß das nur alle 2 minuten abgefragt wird.

Autor:  Song Sinen [ So 09 Dez, 2007 21:57 ]
Betreff des Beitrags: 

8) Danke euch Leute!!

Hm... Wie würde das mit dem Cachen laufen, Nightborn?

Habs bis jetzt so und es funktioniert wenn mans unter die Online-Liste setzt:

[php]// Zuletzt online Anfang
$sqln="SELECT name,laston FROM accounts WHERE locked=0 AND loggedin=0 AND laston>'".date("Y-m-d H:i:s",strtotime(date("r")."-2 hours"))."' ORDER BY aufstiege DESC";
$resultn = db_query($sqln) or die(sql_error($sqln));
$anzahl=db_num_rows($resultn);
if (db_num_rows($resultn)>=1){
$ret.=appoencode("`n`tKür`^zli`qc`Qh `qge`^se`then:`n");
while ($rown = db_fetch_assoc($resultn)){
$werwarda="`q$rown[name]`n";
$ret.=appoencode("$werwarda");
addnav("1$werwarda","index.php");
}}
// Zuletzt online Ende[/php]

Autor:  Auric [ So 09 Dez, 2007 22:09 ]
Betreff des Beitrags: 

Mit Chachen ist gemeint, dass du die Ausgabe des Querys in einer Textdatei oder einem settings-Filed oder öhnlichem liest, wohinein du es in regelmäßigen Abständen speicherst. Dadurch muss nicht bei jedem aufruf der index.php noch sin query über die komplette Accounts-Tabelle gejagt werden.

Autor:  Kevz [ So 09 Dez, 2007 22:31 ]
Betreff des Beitrags: 

@Auric:
settings-Feld?! - Bist du des Wahnsinns? :? :D

Natürlich ist es angebrachter eine TXT-Datei zu nehmen, wie Du es erwähnt hattest. So sparst Du die Verbindung zum (mySQL-)Server und kannst in ruhe mit PHP- weiterarbeiten, ohne Timestamps o.Ä. noch auswerten zu müssen.... :)

Autor:  Song Sinen [ So 09 Dez, 2007 22:50 ]
Betreff des Beitrags: 

Hm, wär sowas dann nich auch gut für die hof.php?

Wird das irgendwo in der logd-standard-version gemacht damit ichs mir anschaun kann?

Autor:  Harthas [ Mo 10 Dez, 2007 10:53 ]
Betreff des Beitrags: 

Bei der hof.php ists insofern nicht allzu schlimm, da diese nicht ganz so oft aufgerufen wird ;-)

Autor:  Kevz [ Mo 10 Dez, 2007 11:26 ]
Betreff des Beitrags: 

In der LotGD- Standard Version?! - Bitte was...??
Ein Cache System von Inhalten o.Ä. gibt es für die 1.x.x. Vor gut 1-2 Jahren hatte ich mal eines für die 0.9.7 geschrieben gehabt. Aber weg ist weg. ^^ - Dennoch sehr, sehr sinnvoll das ganze.

Autor:  Harthas [ Mo 10 Dez, 2007 11:30 ]
Betreff des Beitrags: 

Natürlich ist es sinnvoll.

Aber nur für die hof.php eines zu entwickeln fände ich persönlich nicht wirklich nötig. ^^

Autor:  Kevz [ Mo 10 Dez, 2007 11:31 ]
Betreff des Beitrags: 

Jaein..., aber sie wird nicht ständig eingesehen. Das würde ich nicht unbedingt behaupten wollen. Bei der Bio, dem Chat o.Ä. würde es sich um so mehr lohnen und auch zeigen, was es bringt. (das cachen)

Autor:  Harthas [ Mo 10 Dez, 2007 11:37 ]
Betreff des Beitrags: 

*nick* Auf jeden Fall, da will ich es auch gar nicht abstreiten.

Auch gewisse sich nur selten verändernde Daten wären gecacht wohl um einiges besser aufgehoben.

Autor:  Kevz [ Mo 10 Dez, 2007 12:00 ]
Betreff des Beitrags: 

Das mit dem Cache ist eig. ganz einfach...
Man muss lediglich ein Cache- Verzeichnis erstellen, worin sich die (gecachten) Dateien befinden. Und dann einfach den Zeitstempel der Datei mit dem gegebenen Zeit Interval abgleichen, und dann ggf. erneut Cachen bzw. den Cache aktualisieren. Für das gibt es schon Funktionen... (siehe filemtime)

Autor:  Harthas [ Mo 10 Dez, 2007 12:17 ]
Betreff des Beitrags: 

[php]function cache_speichern($wert, $dateiname, $wann) {

$dateizeit = filemtime("cache/".$dateiname);
$timestamp = time() - $wann;

if ($dateizeit > $timestamp) {
if (file_put_contents("cache/".$dateiname,$wert)) {
return TRUE;
}
else {
return FALSE;
}
}
else {
return TRUE;
}
}

function cache_lesen($dateiname) {

$dateiname = "cache/".$dateiname;

if (file_exists($dateiname)) {
return file_get_contents($dateiname);
}
else {
return FALSE;
}
}
[/php]

Irgend sowas?
$wann sollte dann natürlich in Sekunden angegeben werden... ^^

Oder sowas
[php]function cache($wert, $dateiname, $wann) {

$dateizeit = filemtime("cache/".$dateiname);
$timestamp = time() - $wann;
$dateiname = "cache/".dateiname;

if ($dateizeit > $timestamp) {
if (file_put_contents($dateiname,$wert)) {
return file_get_contents($dateiname);
}
else {
return FALSE;
}
}
else {
return file_get_contents($dateiname);
}
} [/php]

Autor:  Song Sinen [ Mo 10 Dez, 2007 13:40 ]
Betreff des Beitrags: 

Hm... Aber eigentlich würde es doch reichen wenn ich die Liste der Namen in ein Feld in der Datenbank speichere und alle 2 min auslese, oder?

Autor:  Harthas [ Mo 10 Dez, 2007 13:45 ]
Betreff des Beitrags: 

Wenn du sie nur alle zwei Minuten auslesen würdest, hättest du auch nur alle 2 Minuten eine Ausgabe auf dem Bildschirm ;-)
(Sofern du in der Zwischenzeit mal die Seite verlassen hast).

Autor:  Kevz [ Mo 10 Dez, 2007 14:01 ]
Betreff des Beitrags: 

Song Sinen hat geschrieben:
Hm... Aber eigentlich würde es doch reichen wenn ich die Liste der Namen in ein Feld in der Datenbank speichere und alle 2 min auslese, oder?

-Wer sich alles richtig durchliest, ist ganz klar im Vorteil!! Siehe dazu unten.


Kevz hat geschrieben:
@Auric:
[....]
Natürlich ist es angebrachter eine TXT-Datei zu nehmen, wie Du es erwähnt hattest. So sparst Du die Verbindung zum (mySQL-)Server und kannst in ruhe mit PHP- weiterarbeiten, ohne Timestamps o.Ä. noch auswerten zu müssen.... :)

Autor:  Song Sinen [ Mo 10 Dez, 2007 15:01 ]
Betreff des Beitrags: 

Das is schon klar Kevz, musst nich gleich zicken. Wenn ich aber die Timestamps nur alle 2 min auswerte und dann die User mit Farbcodes und allem als Text in ein Feld schreibe berechnet er es auchnicht öfters.

Und irgendwie kann ich mir nich vorstellen dass es viel rausreist vl. 100 Zeichen aus nem Feld in der Db zu holen wenn er die index läd.
Darum die Frage.

Autor:  Harthas [ Mo 10 Dez, 2007 16:09 ]
Betreff des Beitrags: 

Kommt halt auch ganz auf die Dimensionen des Servers an.
Und mit welcher Philosophie man programmiert. Falls es einem in erster Linie um Einfachheit in den Skripten geht, so kann man es womöglich auf diese Art machen. Wenn man jedoch auch etwas auf Performance achten will, geht das nunmal nicht immer.

Zudem sei gesagt, dass Performance-Verlust nicht linear, sondern exponentiell ist. Irgendwann wird vielleicht genau dieses Query schon einiges ausmachen.


Natürlich verbraucht er nicht allzu viel, um nur dieses eine Resultat aus der Datenbank (Settings oder dergleichen) zu holen. Allerdings sind 100 Zeichen wohl je nach Server deutlich zu wenig. Ein Name samt Titel und Farbzeichen kann schnell mal an die 20 Zeichen brauchen, und da hast du die 100 Zeichen schon nur mit 5 Spielern voll.

MySQL ist nunmal der Flaschenhals in LoGD und macht oft den grossen Teil der Ladezeit aus, daher sollte man darauf achten, die Anzahl der Query's wenn möglich stets zu reduzieren.


Mit freundlichen Grüssen,
Harthas

Seite 1 von 2 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/