Wenn man schon kzH rumsitzt, kann man sich ja wenigstens um die unbeliebten Dinge kümmern, die noch auf der eigenen To-Do-Liste stehen.
Konkrekt handelte es sich bei mir dabei um das Caching der API-Abfragen bei meinem WPUBG-Plugin für WordPress und so kommt nun der dritte Beitrag zu diesem Thema zustande.
Das „Problem“ mit der PUBG-API (und auch verdammt vielen anderen APIs) ist, dass man nicht beliebig viele Anfragen stellen kann. In meinem Fall sind es 10 Anfragen pro Minute.
Das kann natürlich zu unerwünschtem Verhalten führen, wenn das Plugin auf einer stark frequentierten WordPress-Installation eingesetzt wird, denn leider werden API-Anfragen in den seltesten Fällen von sog. Caching-Plugins berücksichtigt. Zwar gibt es speziell darauf ausgelegte Plugins, aber sinnvoller wäre es ja schon, diese Aufgabe direkt von WPUBG lösen zu lassen.
Nach kurzer Recherche stieß ich dann auf die Transients API, welche direkt im WordPress Core integriert ist.
Die Transient API bietet die beiden Funktionen set_transient() und get_transient(), um Daten für einen Zeitraum zwischenzuspeichern. Dabei kann nur der maximale Zeitraum der Speicherung, nicht jedoch der minimale Zeitraum festgelegt werden. Man sollte daher darauf achten, eine Methode bereitzuhalten, welche die benötigten Daten erneut abruft, sofern sie im Cache nicht mehr verfügbar sind.
Everyone seems to misunderstand how transient expiration works, so the long and short of it is: transient expiration times are a maximum time. There is no minimum age. Transients might disappear one second after you set them, or 24 hours, but they will never be around after the expiration time.
https://core.trac.wordpress.org/ticket/20316#comment:47
|
$season_transient = get_transient('wpubg_seasonID'); if (!empty($season_transient)) { $seasonID = get_transient('wpubg_seasonID'); } else { $url = "https://api.pubg.com/shards/steam/seasons"; $result = wpubg_getData ($url, $apikey); if (!empty($result)) { ... $seasonID = $data['id']; set_transient('wpubg_seasonID',$seasonID,5*MINUTE_IN_SECONDS); } } |