Warum werden Transienten vorzeitig gelöscht?

Sie würden denken, dass eine vorübergehende Menge, die zu einer bestimmten Zeit abläuft, bis zu dieser Zeit existieren würde. Leider scheint es, dass sie früher aus der database verschwinden, sowohl im Test als auch in der Produktion. Versuchen Sie als ein einfaches Beispiel, dieses Verhalten zu sehen:

 alert("This alert should also show again in 24hr");  <?php set_transient( 'my_messageDismiss', 'dismissed', 86400); //Set for a day } } 

Was fehlt mir an der Transienten-API? Die Warnung wird Stunden später angezeigt, nicht einen Tag später.

Solutions Collecting From Web of "Warum werden Transienten vorzeitig gelöscht?"

TL; DR

  • WordPress Teil der transienten Handhabung ist solide, alles ist ziemlich präzise
  • Transienten verwenden Objektcache anstelle von Datenspeicher für nicht standardmäßige Implementierungen
  • Dies bedeutet, dass einige Back-End-Cache-Systeme den Cache löschen, auf den in letzter Zeit nicht zugegriffen wurde
  • Fazit: Es ist keine WordPress-Fehler, es hängt nur davon ab, wie Ihr Back-End-Cache eingerichtet ist

Sie könnten Transienten präzisieren, aber es erfordert Back-End-Cache-Tweaking, was ich nicht empfehlen, wenn Sie nicht wissen, was Sie tun, zu viel Cache könnte gegenteilige Wirkung haben.

Aber selbst dann, nicht davon ausgehen, dass es 100% genau ist.


Aus WordPress Codex :

Jeder scheint falsch zu verstehen, wie die transiente Exspiration funktioniert, so lange und so kurz: Transiente Exspirationszeiten sind eine maximale Zeit. Es gibt kein Mindestalter. Transienten können eine Sekunde, nachdem Sie sie festgelegt haben, oder 24 Stunden verschwinden, aber sie werden nach der Ablaufzeit nie wieder da sein.

Sie sollten immer eine Rückfallmethode haben.


Warum passiert es ?!

WordPress macht Transienten nur ungültig, wenn sie versucht werden, sie zu lesen (was in der Vergangenheit zu Müllsammlungsproblemen geführt hat). Dies ist jedoch für andere Backends nicht garantiert.

Transienten verwenden den Objektcache für nicht standardmäßige Implementierungen. Der wirklich wichtige Teil, der hier zu beachten ist, ist, dass der Objekt-Cache ein Cache ist und absolut kein Datenspeicher. Dies bedeutet, dass das Ablaufdatum ein maximales Alter ist, nicht ein Minimum oder ein Sollwert.

Ein Ort, an dem dies leicht passieren kann, ist Memcache, der im Least Recently Used (LRU) -Modus eingestellt ist. In diesem Modus löscht Memcache automatisch Einträge, auf die in letzter Zeit nicht zugegriffen wurde, wenn Platz für neue Einträge benötigt wird. Dies bedeutet, dass weniger häufig verwendete Daten (wie sie von Cron-Daten verwendet werden) verworfen werden können, bevor sie ablaufen.

Lesen Sie mehr von diesem Artikel , es ist sehr gut erklärt.


Zwischenspeichern?

Es gibt viele verschiedene Systeme, aber hier ist ein Beispiel, wie MySQL-database-Caching im Allgemeinen funktioniert. Ich bin mir nicht sicher, wie hilfreich es ist, Transienten zwischenzuspeichern, aber ich denke, es könnte nicht schaden.

  • Daten von jeder anderen Abfrage werden zwischengespeichert
  • Jede zwischengespeicherte Daten erhält einen Wert (kompliziertere Abfrage == höherer Wert)
  • Diese Werte werden dekrementiert (wie ein Countdown-Timer, wenn du willst)
  • Das Caching-System überprüft diese Werte in Intervallen
  • Wenn einer dieser Werte Null erreicht, wird dieser Cache zerstört
  • Wenn dieselbe Abfrage erneut ausgeführt wird, wird der Wert auf den Anfangswert zurückgesetzt

Also … Was könntest du daraus schließen? Es hat keinen Sinn, Transienten zu setzen, die sind:

  • Zu einfach
  • Nicht häufig benutzt

Weil diese in den meisten Fällen sehr schnell zerstört werden. Ich hoffe, dies gibt Ihnen ein klareres Bild, wie Caching im Allgemeinen funktioniert. Es priorisiert häufige und komplizierte gegenüber einfachen und selten verwendeten Daten.

Hinweis: Es gibt eine Menge Verallgemeinerungen in der Cache-Erklärung, um das Verständnis zu erleichtern.