AngusIM navigation

Ranking Check

Kostenloser Ranking Service.
Jetzt anmelden und testen!
www.private-ranking.de


Abonnieren

RSS 2.0

Archiv

Suchmaschinenoptimierung
Veröffentlicht in: Programmierung
06.06.2011

Mysql: Datensätze zufällig aus großen Datenbanken auslesen

Nirgendwo lernt man mehr über Datenbankdesign, Entwicklung und Performance wie bei der Arbeit mit großen Datensätzen. Nichts bietet höhere Lernkurven und größeres Frustrationspotential :-) Ein großes Thema ist immer wieder die Sortierung dieser Daten. Ich möchte hier auf einen Sonderfall eingehen, die zufällige Sortierung. Gerade wenn mehrere Skripte oder Prozesse gleichzeitig auf einer Datenbasis arbeiten, möchte man oft, dass diese zufällig Daten auslesen und z.B. aktualisieren.

Normalerweise bietet MySQL die Funktion

  1. ORDER BY RAND()

um die ausgelesene Ergebnismenge per Zufall zu sortieren. Gerne arbeitet man hier auch noch mit LIMIT. MySQL erstellt hierfür intern eine temporäre Tabelle und einen Indexes mit Zufallszahlen, um dann danach zu sortieren. Auch bei angegebenem LIMIT wendet MySQL dies auf die kompletten Daten an, der Rest wird dann einfach verworfen. Das macht generell ja auch Sinn, da man die Zufallswerte aus der gesamten Tabelle erhalten möchte. Das Problem: Je nach Prozessorpower ab einer fünfstelligen Datenmenge LAAAAANGSAM........

Eine Lösung, mit der ich noch bis vor kurzem gearbeitet hatte, war die per OFFSET in Kombination mit LIMIT, die ich hier gefunden habe:

  1. // SQL Count
  2. $sql_count = "SELECT COUNT(id) FROM $table_data";
  3. $anzahl_domains = $this->db->getOne($sql_count);
  4. // Offset = Startpunkt per PHP-Rand
  5. $offset = rand(1,$anzahl_domains);
  6. // Domains auslesen
  7. $sql = "SELECT id, domain FROM $table_data
  8.       LIMIT $offset, $limit";

Ich arbeite mit AdoDB, also denkt Euch Euren Datenbanklayer, wichtig sind hier der SQL und PHP-Code. Also, was habe ich gemacht:

  1. Gezählt, wie viele Daten insgesamt in der DB sind
  2. Zufallswert bestimmt, der zwischen 1 und der Gesamtmenge der Daten liegt
  3. Gewünschte Anzahl Daten ausgelesen, mit der Zufallszahl als "Startwert" (Offset). Mehr zu LIMIT und OFFSET hier.

Vor kurzem ist auch dieses Vorgehen an seine Grenzen gestoßen. Und zwar, weil ich von einem anderen Server auf die Datenbank zugegriffen habe. Die Abfrage selbst war zwar nach wie vor performant, es wurden aber irgendwie riesige Datenmengen übertragen. Nach einiger Recherche fand ich heraus, dass bei obrigem Vorgehen trotzdem ALLE DATEN bis zum Offset ausgelesen werden und diese dann nachträglich abgeschnitten, siehe auch hier.

Aber die Lösung lag sehr nahe, gefunden bei akinas.com, wenn auch etwas umständlich. Hier meine Lösung, die (bis dato, man weiß ja nie ;-)) super funtkioniert:

  1.  // Domains auslesen 
  2. $sql = "SELECT id, domain FROM $table_data
  3. WHERE id > $offset
  4. LIMIT $limit";

Bei der WHERE-Bedingung scheinen die Daten echt gefiltert zu werden. Thats's it!

Kommentare 0
Views: 281
Veröffentlicht in: Typo3
05.05.2010

Crawler TSConfig für tt_news pagination

Bei der Arbeit mit Typo3 kommt häufig auch der Crawler zum Einsatz. Vor allem beim Caching großer Webpräsenzen ist er eine große Hilfe. Denn es ist gerade hinsichtlich des Zusammenhangs Ladezeit - Suchmaschinenranking wichtig, dass alle Webseiten schnell abgerufen werden können.

Der Crawler zieht seine Konfiguration aus der TSConfig der Rootseite im Backend. Eine ausführliche Anleitung findet sich in der

Für den Crawler gibt der Pfad "tx_crawler.crawlerCfg.paramSets"die Parameter zur Konfiguration an. Eine normale Konfiguration sieht folgendermaßen aus:

  1.  
  2. tx_crawler.crawlerCfg.paramSets {
  3.   language = &L=[|_TABLE:pages_language_overlay;_FIELD:sys_language_uid]
  4.   language.procInstrFilter =tx_indexedsearch_reindex, tx_indexedsearch_crawler
  5.   language.baseUrl = http://www.domain.de/
  6. }

Im Objekt "language", wessen Name i.Ü. frei wählbar ist, werden als Erstes an den Crawler Parameter übergeben. Den String in den eckigen Klammern wertet der Crawler so aus, dass im ersten Teil eine Tabelle angegeben werden kann, aus der dynamisch abgefragt wird und im Zweiten die jeweilige Spalte. Des Weiteren kann man über den Konfigurations-Parameter "procInstrFilter" zusätzliche Extensions in den Crawlprozess einbinden. Die baseUrl gibt dem Crawler die zu crawlende Domain an.

Der Crawler und die Extension tt_news

Da Inhalts-Erweiterungen wie z.B. tt_news eine andere Art der Inhaltsverwaltung haben, muss der Crawler daran angepasst werden. Bei tt_news sind die Inhaltselemente nicht kaskardierend an eine Rootseite eingehängt, sondern liegen in einem Ordner. Die Auswahl des jeweiligen Datensatzes erfolgt über einen Parameter in der URL. Diese Funktion muss in der Crawler-TSConfig nachgebildet sein:

  1. #_PID:1234 ist der Systemordner mit den Newsbeiträgen
  2. #pidsOnly = 123 ist die Seite mit der Einzalansicht für Newsbeiträge.
  3. tx_crawler.crawlerCfg.paramSets {
  4.   tt_news = &tx_ttnews[tt_news]=[_TABLE:tt_news;_PID:1234]
  5.   tt_news.procInstrFilter = tx_indexedsearch_reindex
  6.   tt_news.cHash = 1
  7.   tt_news.pidsOnly = 123
  8. }

Wie man sieht, ist die Übergabe der Paramter ähnlich wie im ersten Beispiel über die Angabe der Datentabelle (tt_news), wobei hier die ID des Sysordners angegeben ist, in dem die News liegen. Damit der Crawler diese Konfiguration nur für die einzelnen Newsbeiträge ausführt, wird er über "pidsOnly" auf die UID der "Singelview"-Seite eingesperrt.

So weit, so gut. Steht ja auch alles in der Doku.

Sonderfall: tt_news pagination. Erweiterte Konfiguration

Bei tt_news gibt es darüber hinaus eine Pagination. Diese listet in der LIST - Ansicht alle weiteren Beiträge auf Unterseiten auf, sobald die maximale Anzahl Seiten pro Listenansicht erreicht ist. Diese "Unterseiten" werden über den URL-Parameter "pointer" generiert. Ohne eine entsprechende Konfiguration werden diese Übersichtsseiten aber nicht vom Crawler erfasst. Dies mag für das Caching eventuell unerheblich sein. Wenn man mithilfe des Crawlers und der Extension staticpub jedoch HTML-Seiten generieren möchte, fehlen die Dateien im Ordner der statischen Seiten.

Als Lösung müsste man demnach eine weitere Crawler-Konfiguration anlegen und dem Parameter "pointer" die jeweilige Pagination-ID (Also 1-n) mitgeben. Generell ist die Übergabe dynamischer Parameter über das TSConfig abhängig von der jeweiligen Extension. Wie oben bereits gesehen, kann über die TSConfig dem Crawler eine Tabellenabfrage mitgegeben werden. Und witzigerweise scheinen die Macher des Crawlers auch an den Sonderfall mit der Pagination gedacht zu haben. Bei einem Blick in die Skript-Dateien fällt einem die Funktion "expandParamters" ins Auge, welche die übergebenen Informationen auswertet. Und an diese Funktion kann man auch einen "integer-range" übergeben, im Format [int] - [int]. Im TSConfig würde das folgendermaßen aussehen:

  1.   tt_news_2 = &L=[|_TABLE:pages_language_overlay_FIELD:sys_language_uid]&tx_ttnews[pointer]=[1-50]
  2.   tt_news_2.procInstrFilter = tx_staticpub_publish
  3.   tt_news_2.cHash = 1
  4.   tt_news_2.pidsOnly = 123

Wobei der Crawler hier die Werte von eins bis 50 durchgeht, unabhängig davon, ob noch Inhalte für die Pagination vorhanden sind. Aber es tut, was es soll, und das ist das Wichtigste :-)

Kommentare 0
Views: 1380
Veröffentlicht in: Programmierung
02.03.2010

Vektor Grafiken nach jpg umwandeln

Es kommt häufiger vor, dass ich mir lizenzfreie Bilder kaufe, z.B. bei istockphoto.com. Dort gibt es unter anderem einige tausend sehr schicke Vektorgrafiken. Überraschenderweise musste ich feststellen, dass es nicht ganz einfach ist, an Informationen heranzukommen, wie man eine bestehende Vektorgrafik in ein Webformat (z.B. jpg) umwandelt / konvertiert. Die googlesuche nach "Vektor in jpg umwandeln" liefert fleißig "jpg in Vektor umwandeln" :-)

Deshalb hat es etwas gedauert, bis ich die Lösung hatte. Sie lautet Irfanview. Ich kenne das Programm noch aus den Anfängen von Windows, als es noch keinen ordentlichen Bildbetrachter gab, habe sie aber seit Jahren aus den Augen verloren. Nach dem Download und der Installation des Programms muss man allerdings noch die Plugins nachinstallieren, die gibts hier. Am besten direkt alle drüberinstallieren. Die Profis installieren nur das Paket mit Postscript. Dann kann man mit Irfanview die Vektorgrafik öffnen und in jedem beliebigen Format abspeichern.

Der Nachteil an dieser Methode ist, dass die Qualität der Bilder abnimmt. Das liegt, soweit ich das einschätzen kann, an Irfanview. Wenns wirklich gut werden soll, bleibt wohl nur der Kauf einer Vektorsoftware wie CorelDraw.

 

Kommentare 0
Views: 1113
Veröffentlicht in: Typo3
18.12.2009

Typo3, Realurl, Indexseiten und Weiterleitungen

Durch Zufall bin ich durch die google Webmastertools darauf aufmerksam geworden, dass ich eine Fehlerseite auf allen meinen Typo3-Projekten habe, wo eigentlich keine sein sollte. Wenn ich die Indexseite einer Typo3-Installation mit laufendem Realurl folgendemaßen Aufrufe, bekomme ich einen 404 Fehler:

http://www.domain.de/index.html

bzw. das für Realurl typische

"Segment "index" was not a keyword for a postVarSet as expected!"

Normalerweise bedeutet dieser Aufruf ja "gib mir die Startseite zurück". Da eber einige eingehende Links auf die index.html verweisen, wollte ich diese per 301-Weiterleitung auf die Startseite "/" umziehen.

Dafür wollte ich per htaccess eine Weiteleitung setzen. Das geht bekanntermaßen per Redirect:

  1. RedirectPermanent /index.html http://www.domain.de/

Geht aber nicht, und der Fehler ist sogar nachvollziehbar. Da normalerweise ein Aufruf des Domain-Wurzelverzeichnisses den Aufruf der Index-Datei zur Folge hat, ist obige Anweisung eine Endlosschleife. Sozusagen "Leite von der Indexseite auf das Wurzelverzeichnis auf die Indexseite".

Die Lösung bringt Typo3 mit. Wobei ich mich ehrlich gesagt darüber wundere, dass sie funktioniert... Bei installiertem Realurl können die sprechenden URLs über das "Info" Modul im linken Backend-Menü administriert werden (Info->"Speaking URL Management" im Dropdown). Im daraufhin erscheinenden Dropdown "Redirects" auswählen. Dort auf "New Entry". Url ist demnach die "index.html", die weitergeleitet werden soll auf "Destination"->"http://www.domain.de/". Natürlich per 301, man will ja nichts verschenken :-). Dann wird sauber weitergeleitet.

Was ich nicht verstehe - vielleicht hilft hier jemand weiter, der mehr Ahnung hat: Wo ist der Unterschied, ob ich die Weiterleitung per htaccess setze oder per Skript im header? Sollte die Endlosschleife nicht in beiden Fällen auftreten? Naja, ich bin froh, das es jetzt erstmal läuft!

Kommentare 0
Views: 1615
Veröffentlicht in: Typo3
03.12.2009

Arbeiten mit langen Seitentiteln

Nachdem ich das Problem der großen Seitenbäume durch einen Workaround lösen konnte, stand ich jetzt bei dem gleichen Projekt vor dem Problem, dass die Seitentitel zu lang waren und im Backend abgeschnitten wurden. Jeder Titel wird standardmäßig nach 30 Zeichen gekürzt. Wenn innerhalb dieser 30 Zeichen kein individuelles Merkmal der Seite erscheint, hat man keine Möglichkeit, die Seiten voneinander zu unterscheiden. Die Lösung is, dass man im Typo3 für die Backend-Benutzer den "Standard-Abschnitt" und die Anzeige vergrößert:

TSconfig des BE-Users oder besser der BE-Benutzergruppe:

  1. # Breite für Navi-Frame
  2. setup.override.navFrameWidth = 300
  3.  
  4. # Seitentitel erst nach 100 Zeichen abschneiden
  5. setup.override.titleLen = 100

Gefunden habe ich die Lösung bei Sebastian. Thx!

Kommentare 0
Views: 1096