PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Modifikation: Weniger Queries in showthread.php


Gérome
15.03.2008, 11:20
Moin,

die Anzeige der Entfernung von sich selbst zu User XY im Postbit ist durchaus knuffig. Leider kostet dieses Feature eine ganze Menge an Queries - pro angezeigtem Beitrag genau eine zusätzliche Query. Hierbei werden auch redundante Queries gnadenlos erneut ausgeführt. Hat ein Benutzer also mehr als nur einen Beitrag verfasst, so werden die benötigten Informationen zur Entfernungsberechnung auch mehrfach aus der Datenbank ausgelesen.

Eine erste Idee könnte es sein, einen lokalen Cache zu installieren, der die bereits abgefragten Informationen vorhält und somit redundante Queries vermeidet. Diese Lösung mag noch nicht perfekt sein, aber sie ist sehr simpel und für einen ersten Ansatz durchaus brauchbar.

Ich habe zu diesem Zweck zuerst zwei neue Plugins zum "Housekeeping" angelegt:

(1) "showthread_start", hier wird der Cache initialisiert:
PHP:
----------
Der Inhalt dieses Abschnitts ist nur für Lizenznehmer sichtbar, Sie werden derzeit jedoch nicht als Lizenzinhaber erkannt.<br />
<br />
Bitte öffnen Sie den <a href="http://members.vbulletin-germany.com/membersupport_priority.php">Kundenbereich</a>, tragen Sie Ihre E-Mail-Adresse ein, mit der Sie sich hier registriert haben und aktivieren Sie die Lizenzüberprüfung für http://www.vbulletin-germany.org.
----------

(2) "showthread_complete", hier wird der Cache zerstört:
PHP:
----------
Der Inhalt dieses Abschnitts ist nur für Lizenznehmer sichtbar, Sie werden derzeit jedoch nicht als Lizenzinhaber erkannt.<br />
<br />
Bitte öffnen Sie den <a href="http://members.vbulletin-germany.com/membersupport_priority.php">Kundenbereich</a>, tragen Sie Ihre E-Mail-Adresse ein, mit der Sie sich hier registriert haben und aktivieren Sie die Lizenzüberprüfung für http://www.vbulletin-germany.org.
----------

Dann habe ich den Code des bestehenden Plugins für "postbit_display_complete" verändert. Im Wesentlichen habe ich um die Datenbank-Anfrage herum nur eine IF-Abfrage gebastelt, ob die nötigen Infos bereits im Cache vorliegen. Die Änderung beginnt ab der Zeile $f = M_PI ..., nach dem Code-Block geht's mit der Zeile vbmmdist = round(... aus dem Original-Code weiter:

PHP:
----------
Der Inhalt dieses Abschnitts ist nur für Lizenznehmer sichtbar, Sie werden derzeit jedoch nicht als Lizenzinhaber erkannt.<br />
<br />
Bitte öffnen Sie den <a href="http://members.vbulletin-germany.com/membersupport_priority.php">Kundenbereich</a>, tragen Sie Ihre E-Mail-Adresse ein, mit der Sie sich hier registriert haben und aktivieren Sie die Lizenzüberprüfung für http://www.vbulletin-germany.org.
----------


Der Wirkungsgrad dieses "Hacks" hängt natürlich wesentlich von der Beitragsstruktur ab. Je öfter ein Benutzer sich in der Beitragsanzeige wiederholt, desto größer wird die Ersparnis an Queries. Wird allerdings eine Seite mit Beiträgen angezeigt, die ausschließlich von unterschiedlichen Autoren stammen, so verpufft die Wirkung dieser Code-Änderung natürlich völlig.

Sei's drum - für diese minimale Änderung dürfte der durchschnittliche Nutzen akzeptabel sein. Mit sehr hoher Wahrscheinlichkeit würde ein leicht anderere Ansatz zum Datensammeln eine weitere Verbesserung bringen, aber das muss ich im Laufe des Tages mal in Ruhe ausprobieren.


Grüße,
Gérome

Christian
15.03.2008, 11:55
Netter Ansatz, wobei es besser wäre einen einzigen Query dafür zu nutzen und nicht für jeden Post einen. Möglich ist das jedenfalls.

Gérome
15.03.2008, 12:03
Da stimme ich Dir absolut zu. :-)
Die Infos für jeden der Beiträge kann man ermitteln, indem man sich in den Hook "showthread_query" einklingt. (Mein derzeit verfolgter Ansatz.) Das sorgt dann dafür, dass im Hook "postbit_display_complete" die Infos über "$this->post['longitude']" bzw. "$this->post['latitude']" verfügbar sind:

PHP:
----------
Der Inhalt dieses Abschnitts ist nur für Lizenznehmer sichtbar, Sie werden derzeit jedoch nicht als Lizenzinhaber erkannt.<br />
<br />
Bitte öffnen Sie den <a href="http://members.vbulletin-germany.com/membersupport_priority.php">Kundenbereich</a>, tragen Sie Ihre E-Mail-Adresse ein, mit der Sie sich hier registriert haben und aktivieren Sie die Lizenzüberprüfung für http://www.vbulletin-germany.org.
----------

Was dann noch bleibt wäre die Abfrage der Daten für den aktuell angemeldeten User. Mal sehen, ob man sich da auch irgendwo einklinken kann - alternativ ist's eben die eine zusätzliche Query, die dann nötig wird.

Was ich gegenwärtig noch nicht geprüft habe, sind mögliche Auswirkungen auf "showpost.php" und "printview.php". Immerhin rufen die ja auch den Hook "postbit_display_complete" auf - und bisher habe ich mich da nicht in irgendwelche Queries "gejoint". Aber das sollte dann nur noch eine Fingerübung sein - und im Ausdruck würde ich die Daten auch nicht haben wollen. Ich bastel' da mal weiter. ;-)


Grüße,
Gérome

Gérome
15.03.2008, 12:53
So, unter Berücksichtigung der obigen Änderung (inkl. dem nachträglichen Edit!) könnte man den Code für den Hook "postbit_display_complete" wie folgt aufbauen:

PHP:
----------
Der Inhalt dieses Abschnitts ist nur für Lizenznehmer sichtbar, Sie werden derzeit jedoch nicht als Lizenzinhaber erkannt.<br />
<br />
Bitte öffnen Sie den <a href="http://members.vbulletin-germany.com/membersupport_priority.php">Kundenbereich</a>, tragen Sie Ihre E-Mail-Adresse ein, mit der Sie sich hier registriert haben und aktivieren Sie die Lizenzüberprüfung für http://www.vbulletin-germany.org.
----------

Ob es legitim ist, zur Laufzeit Daten in das Array "$vbulletin->userinfo" zu schreiben, weiß ich noch nicht. Es geht und erspart die Verwendung weiterer Caches. Ob es schön ist, sei dahingestellt. Zudem nahm ich mir die Freiheit, die Variable $notself (oder ähnlich) herauszuwerfen und durch "$show['vbmm']" zu ersetzen. Ich bekomme bei negativer Logik meist einen Knoten im Hirn. Aber diese Änderung ist letztlich irrelevant.


Natürlich muss der Code noch getestet werden, aber der erste Eindruck ist gut und die Richtung scheint zu stimmen. Im Laufe des Tagens mache ich diesen Ansatz mal "rund".

Ich sehe gerade, dass die Einrückung das Copy&Paste nicht überlebt hat ... egal, da muss sie jetzt durch ;-)


Grüße,
Gérome

Christian
15.03.2008, 13:16
Da iss ja immernoch ein Query drinn ...

Gérome
15.03.2008, 13:32
Na schön. *g*

Neues Plugin for Hook "fetch_userinfo_query":

PHP:
----------
Der Inhalt dieses Abschnitts ist nur für Lizenznehmer sichtbar, Sie werden derzeit jedoch nicht als Lizenzinhaber erkannt.<br />
<br />
Bitte öffnen Sie den <a href="http://members.vbulletin-germany.com/membersupport_priority.php">Kundenbereich</a>, tragen Sie Ihre E-Mail-Adresse ein, mit der Sie sich hier registriert haben und aktivieren Sie die Lizenzüberprüfung für http://www.vbulletin-germany.org.
----------



Damit wird das Array userinfo korrekt mit den Werten bestückt und der Code weiter oben läuft dann nicht mehr in den IF-Block mit der Query hinein. Das Plugin für den Hook "postbit_display_complete" kann dadurch sogar noch weiter verschlankt werden.


Grüße,
Gérome

Vossi
15.03.2008, 14:38
Danke! :D:D

Du hast mir/uns damit sehr geholfen.

Gérome
15.03.2008, 18:50
Aber gern doch.:-)
Es freut mich, dass ich wenigstes ein bisschen was beitragen konnte. :-)


Grüße,
Gérome

René Kunze
15.03.2008, 18:52
Könnte man das nochmal zusammenfassen, was muß man den nun machen.

Rotti
15.03.2008, 19:12
So ne kleine feine Install Anleitung wäre schon nicht schlecht....;)
Bis jetzt Blick ich nicht durch :confused: aber sieht Interessant und Nützlich aus...:D

Vossi
15.03.2008, 19:23
Am besten Ihr wartet noch einige wenige Tage bis die Version 2.0.1 released wird. Dann sind Dinge wie diese verbessert/gefixed/geändert und Ihr braucht nicht am System herumschrauben.

Wir arbeiten auf Hochtouren und nutzen jede Minute in der Freizeit für dieses Projekt; es wird also nicht mehr lange dauern. Wie gesagt, ein paar wenige Tage...

René Kunze
15.03.2008, 19:26
da hast du recht, ich warte.

So funktioniert es ja schon klasse es kommen halt immer mehr Verbesserungen.

Gérome
15.03.2008, 19:34
Ich habe schon heute mittag aufgehört, durchzublicken :D

Trotzdem will ich mich an einer "Anleitung" versuchen. Es wird nötig sein, neue Plugins anzulegen sowie ein bestehendes Plugin zu ändern (die Template-Änderung lasse ich mal außen vor und passe den Code ein wenig an). Wer sich das nicht zutraut oder bei diesen Schritten unsicher ist, der sollte kein Risiko eingehen und noch eben warten, bis Vossi Version 2.0.1 veröffentlicht. Ich weiß es zwar nicht, aber ich könnte mir vorstellen, dass er den Code so oder ähnlich integrieren wird.

Für die Mutigen unter Euch hier nun die Anleitung - der Code ist hinsichtlich seiner Formatierung nicht hübsch, aber er tut:

(1) Neues Plugin anlegen
Produkt: "vBMembermap"
Hook-Location: "fetch_userinfo_query"
Title: "vbm-patch :: Extend Query (Fetch Userinfo)"
Code:
PHP:
----------
Der Inhalt dieses Abschnitts ist nur für Lizenznehmer sichtbar, Sie werden derzeit jedoch nicht als Lizenzinhaber erkannt.<br />
<br />
Bitte öffnen Sie den <a href="http://members.vbulletin-germany.com/membersupport_priority.php">Kundenbereich</a>, tragen Sie Ihre E-Mail-Adresse ein, mit der Sie sich hier registriert haben und aktivieren Sie die Lizenzüberprüfung für http://www.vbulletin-germany.org.
----------(Wichtig: Active auf 'true' setzen)


(2) Neues Plugin anlegen
Produkt: "vBMembermap"
Hook-Location: "showthread_query"
Title: "vbm-patch :: Extend Query (Showthread)"
Code:
PHP:
----------
Der Inhalt dieses Abschnitts ist nur für Lizenznehmer sichtbar, Sie werden derzeit jedoch nicht als Lizenzinhaber erkannt.<br />
<br />
Bitte öffnen Sie den <a href="http://members.vbulletin-germany.com/membersupport_priority.php">Kundenbereich</a>, tragen Sie Ihre E-Mail-Adresse ein, mit der Sie sich hier registriert haben und aktivieren Sie die Lizenzüberprüfung für http://www.vbulletin-germany.org.
----------(Wichtig: Active auf 'true' setzen)


(3) Bestehendes Plugin bearbeiten
Plugin "vBulletin-Membermap: Postbit" (bedient den Hook "postbit_display_complete").

Wer sich hier nicht ganz sicher ist, der möge sich den bestehenden PHP-Code, der jetzt im Eingabefeld angezeigt wird, in die Zwischenablage kopieren und dann beispielsweise in einem Editor sichern. Wer Mut zum Risiko hat, der fährt einfach fort, den bestehenden PHP-Code komplett aus dem Eingabefeld zu löschen und dafür den folgenden Code einzufügen:

PHP:
----------
Der Inhalt dieses Abschnitts ist nur für Lizenznehmer sichtbar, Sie werden derzeit jedoch nicht als Lizenzinhaber erkannt.<br />
<br />
Bitte öffnen Sie den <a href="http://members.vbulletin-germany.com/membersupport_priority.php">Kundenbereich</a>, tragen Sie Ihre E-Mail-Adresse ein, mit der Sie sich hier registriert haben und aktivieren Sie die Lizenzüberprüfung für http://www.vbulletin-germany.org.
----------



*überleg* Das sollte es dann gewesen sein. Solltest Du nun feststellen, dass Du Deine Membermap, das gesamte vBulletin oder gar das komplette Rechenzentrum Deines Hosters in Schutt und Asche gelegt haben solltest, dann ... *Schulterzuck* ... keine Ahnung, is' Vossis Produkt. :D

Mal im Ernst: Was, wenn etwas schief gelaufen sein sollte? Die beiden neuen Plugins kannst Du leicht deaktivieren, damit bist Du die schon mal los. Und den geänderten Code aus Schritt 3 wirst Du los, indem Du Deine Sicherheitskopie wieder einfügst. Danach ist die Map wieder auf dem alten Stand.

Grüße,
Gérome


@Vossi: Sorry, habe Deinen neuen Beitrag zu spät gelesen. Sollte meine Anleitung dazu beitragen, Deinen Support-Aufwand zu potenzieren, so lösche diesen Beitrag bitte.

Vossi
16.03.2008, 17:01
Im PlugIn für hook 'fetch_userinfo_query' könnt Ihr
PHP:
----------
Der Inhalt dieses Abschnitts ist nur für Lizenznehmer sichtbar, Sie werden derzeit jedoch nicht als Lizenzinhaber erkannt.<br />
<br />
Bitte öffnen Sie den <a href="http://members.vbulletin-germany.com/membersupport_priority.php">Kundenbereich</a>, tragen Sie Ihre E-Mail-Adresse ein, mit der Sie sich hier registriert haben und aktivieren Sie die Lizenzüberprüfung für http://www.vbulletin-germany.org.
----------
durch
PHP:
----------
Der Inhalt dieses Abschnitts ist nur für Lizenznehmer sichtbar, Sie werden derzeit jedoch nicht als Lizenzinhaber erkannt.<br />
<br />
Bitte öffnen Sie den <a href="http://members.vbulletin-germany.com/membersupport_priority.php">Kundenbereich</a>, tragen Sie Ihre E-Mail-Adresse ein, mit der Sie sich hier registriert haben und aktivieren Sie die Lizenzüberprüfung für http://www.vbulletin-germany.org.
----------
ersetzen und den Code des PlugIns für hook 'showthread_query' nochmal als weiteres PlugIn für hook 'showpost_start' hinzufügen, dann wird die Entfernungsberechnung auch für einen einzelnen Beitrag (link aus thread heraus) angezeigt.

Vossi
16.03.2008, 17:02
@Vossi: Sorry, habe Deinen neuen Beitrag zu spät gelesen. Sollte meine Anleitung dazu beitragen, Deinen Support-Aufwand zu potenzieren, so lösche diesen Beitrag bitte.
Beiträge löschen ist böse! :p

Nee, kein Problem, wirklich nicht! Schliesslich kann jeder Coder dadurch etwas dazulernen!

der_ellipsoide
25.03.2008, 00:51
Ich finde eure Arbeit super! Könnte die Modifikation auch dazu beitragen, den häufigen SQL Fehler

mysql_connect() [<a href='function.mysql-connect'>function.mysql-connect</a>]: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
/home/xxx/public_html/includes/class_core.php on line 274

zu beheben und den Serverload erheblich zu senken? Denn damit haben viele User, die begrenzt RAM zur Verfügung haben, erhebliche Probleme.

Im Zusammenspiel mit http://www.vbulletin.com/docs/html/datastore

// ****** DATASTORE CACHE CONFIGURATION *****
$config['Datastore']['class'] = 'vB_Datastore_Filecache';
und
/includes/datastore/datastore_cache.php CHMOD777

wäre Stabilität und Geschwindigkeit gewährleistet.

Wenn ich falsch liege, bitte unter Ulk ablegen.

Hoffi
25.03.2008, 11:55
Der Serverload hat nichts mit dem RAM der User zu tun...? Ich verstehe nicht was du meinst.