Querdenkender Webworker mit WordPress-Affinität

Die Transients API von WordPress

Schon seit der Version 2.8 verfügt WordPress über einen eigenen Mechanismus, der das Speichern von Cache-Daten ermöglicht: die Transients API. Mit nur einigen wenigen Zeilen Code kann man sich den Ärger mit selbst-gestrickten Funktionalitäten sparen, die nur dem Zweck dienen, Daten für eine bestimmte Zeit zwischenzuspeichern, um beispielsweise die Ausführungszeit eines Plugins zu beschleunigen.

Die Funktionen der Transients API ähneln denen der WordPress Options API dabei sehr, was die Implementierung noch erleichtern sollte. Neben der Benennung der Funktionen gibt es als einzigen Unterschied lediglich einen zusätzlichen Parameter, mit dem die Verfallsdauer eines Eintrags bereits beim Anlegen geregelt wird. Intern benutzt die  Transients API unter Umständen nämlich auch die Funktionen der Options API.

„Unter Umständen“ habe ich ganz bewusst geschrieben. Schaut man sich den Code der Funktionen an, wird klar, warum man sich nicht darauf verlassen sollte, dass die Daten in der Options-Tabelle abgelegt werden. Möglicherweise kommen konfigurationsbedingt ganz andere Mechanismen zum Einsatz. Lediglich diese und zwei weitere Kleinigkeiten muss man im Hinterkopf behalten, wenn man die API verwendet.

Sollte die Transients API die Daten eben doch in der Options-Tabelle speichern, besteht das erste (jedoch nicht sehr kritische) Problem darin, dass die Spalte für die Optionsnamen standardmäßig maximal 64 Zeichen zulässt. Längere Optionsnamen werden einfach gekürzt. Das hört sich im ersten Moment nicht so dramatisch an. Es ist jedoch wichtig zu wissen, dass die Transients automatisch das Prefix _transient_ verpasst bekommen.

Ein zweiter Datensatz, der den Zeitstempel enthält, erhält zudem automatisch das Prefix _transient_timeout_, was die maximale Länge eines Transient-Namens auf 45 Zeichen beschränkt. Will man beispielsweise Daten von entfernten Systemen abspeichern und den URL im Namen des Transient vorhalten, scheint der Einsatz von md5 () zwingend, um die oft viel längeren Webadressen auf 32 Zeichen zu begrenzen.

Ein kleines Beispiel dazu, wie mein Plugin scGeSHi mit der Problematik umgeht, wenn es den Quellcode von entfernten Webservern abholt und zwischenspeichert:

<!DOCTYPE html>
<html lang=en>
  <meta charset=utf-8>
  <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
  <title>Error 404 (Not Found)!!1</title>
  <style>
    *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}
 </style>
  <a href=//www.google.com/><span id=logo aria-label=Google></span></a>
  <p><b>404.</b> <ins>That’s an error.</ins>
  <p>The requested URL <code>/svn/trunk/examples/transients-api.php</code> was not found on this server.  <ins>That’s all we know.</ins>

Ein zweites Problem hat ebenfalls indirekt mit der Transient API zu tun, trifft aber vor allem auf den Umgang mit der Options API zu. Man sollte sicherstellen, dass sich die Daten, die man speichern will, auch serialisieren lassen. WordPress wird das automatisch versuchen, was aber beispielsweise bei SimpleXML-Objekten regelmäßig schief geht. Beim Testen von myLCO bin ich rüde daran erinnert worden.

Wer um diese kleinen Stolperstricke weiß, bekommt eine verlässliche und robuste Möglichkeit an die Hand, Daten temporär vorzuhalten. Dem Anwender wird an dieser Stelle wahrscheinlich nur klar, was es mit den Datensätzen in der Options-Tabelle auf sich hat, die mit _transient_ beginnen. Im Normalfall sollte ein Löschen dieser Datensätze nie ein Problem sein. WordPress oder das verantwortliche Plugin werden diese bei Bedarf wieder neu anlegen.

Das könnte Dich auch interessieren:

Deine Meinung ist uns wichtig

*