AJAX-Performance

admin-ajax.php ist langsam und flutet den Server

Das Access-Log füllt sich mit POST /wp-admin/admin-ajax.php und jeder Aufruf dauert Sekunden, während das Frontend sich noch schnell anfühlt. Was dieser Endpoint wirklich lädt - und wie Sie sehen, welches Plugin dahintersteckt.

Warum eine langsame admin-ajax.php wie ein Angriff aussieht

admin-ajax.php ist der einzige AJAX-Endpoint für ganz WordPress. Heartbeat, Dashboard-Widgets, Page Builder, Warenkorb-Fragmente, Live-Suche - jedes interaktive Feature postet auf diese eine Datei, statt eine Seite zu laden.

Der teure Teil ist der Boot. Jeder Aufruf führt einen kompletten WordPress-Load aus - plugins_loaded, init, admin_init - im wp-admin-Kontext und feuert dann den Action-Hook. Ein Plugin, das 400 ms auf admin_init verbrennt, zahlt diesen Preis bei jedem ankommenden Aufruf, egal welche Action ihn ausgelöst hat.

Das Muster

Die CPU steigt und das Access-Log füllt sich mit POST /wp-admin/admin-ajax.php, jeder Request antwortet erst nach Sekunden. Das Frontend kann sich weiterhin schnell anfühlen, weil der Page-Cache es abdeckt, während jeder offene Editor-Tab einen weiteren Strom von Aufrufen an denselben Endpoint schickt.

Zwei verschiedene Beschwerden landen also auf derselben Datei: Jeder Aufruf ist langsam und die Aufrufe hören nicht auf. Beide beginnen mit derselben Frage - was läuft eigentlich in diesen Requests?

Wer ruft admin-ajax.php immer wieder auf

Bevor Sie ein Botnetz verdächtigen, zählen Sie die Aufrufer. Die Wiederholungstäter sind langweilig:

Aufrufer Was er tut
Heartbeat Der Post-Editor postet etwa alle 15 Sekunden auf admin-ajax.php, solange er offen ist. Drei Tabs auf demselben Beitrag bedeuten drei Aufruf-Streams.
Polling-Plugins Backup-Dashboards, Security-Scanner, Chat-Widgets und Analytics-Panels rufen den Endpoint im Takt auf, egal ob jemand hinschaut oder nicht.
Frontend-Ajax Warenkorb-Fragmente, Filter und Form-Handler mit nopriv-Hook laufen auch für ausgeloggte Besucher, also bringt echter Traffic seine eigene Last mit.
Ihr eigener Handler Jedes Plugin oder Theme, das eine wp_ajax_-Action registriert, teilt sich denselben Endpoint und dieselben Boot-Kosten.

Der Network-Tab in Ihrem Browser zeigt den action-Parameter der langsamen Aufrufe und das Access-Log zeigt die Rate. Das sagt Ihnen, welcher Stream es ist. Es sagt Ihnen nicht, warum die Aufrufe Sekunden kosten.

Einen Request profilieren, den Callback sehen

Wer die Action kennt, kennt die Ursache noch nicht. Drumherum sitzt der komplette Plugin-Stack - jeder Callback, der an plugins_loaded, init, admin_init und die Action selbst hängt, läuft bei diesem Aufruf.

Find Slow Callbacks (Pro) profiliert eine URL auf Ihrer Website. Fügen Sie admin-ajax.php selbst ein - oder die Admin-Seite, die die langsamen Aufrufe abfeuert - und es schickt einen versteckten Request mit Ihren Admin-Cookies, misst jeden Callback über dem Schwellenwert und sortiert sie nach Millisekunden, mit Hook und Quelldatei.

Weil der ganze Plugin-Stack bei jedem Aufruf bootet, beantwortet die Ergebnistabelle zwei Fragen auf einmal: Welcher Callback macht jeden Ajax-Aufruf langsam, und welcher lief nur in Ihrer Action. Ein Plugin, das 400 ms auf admin_init verbrennt, steht ganz oben - es bremst jeden Aufruf genauso wie jede Admin-Seite.

Sessions werden gespeichert. Profilieren, den Übeltäter entfernen oder fixen, wieder profilieren - das Vorher und Nachher steht in derselben Verlaufstabelle.

Funktioniert auch für den Rest von wp-admin

Jede URL auf derselben Website kann profiliert werden, nicht nur der Ajax-Endpoint - derselbe Request beantwortet die Beschwerde über das langsame wp-admin, wenn ganze Admin-Screens kriechen.

Wenn der langsame Teil eine einzige Query ist

Manchmal ist der Callback nur eine dünne Hülle und die Sekunden stecken in einer einzigen Query - ein Meta-Lookup ohne Index, ein Table-Scan bei jedem Poll, eine Suche mit LIKE über eine große Tabelle.

Slow Query Analyzer protokolliert jede Query über dem Schwellenwert - standardmäßig 0.05 s - samt Aufrufer, lässt dann EXPLAIN auf jede Erfassung laufen und schlägt einen fertigen Index vor. admin-ajax.php zählt als Admin-Request, darum fängt der Admin-only-Standardmodus Ajax-Aufrufe ohne jede Einstellungsänderung ab.

Die beiden lesen denselben Request von zwei Enden. Der Profiler sagt „dieser Callback hat 4 s gebraucht“, der Analyzer sagt „und 3.8 s davon war dieses SELECT auf wp_postmeta“. Zusammen zeigen sie auf eine Datei und eine Zeile SQL.

Callback und Query bekannt? Das ist der größte Teil der Diagnose - der Fix ist ein Patch, ein Ersatz oder ein Bugreport mit den Zahlen im Anhang.

Pro ab $79/Jahr →

Was die Module nicht tun - das sollten Sie vorher wissen

  • Der Profiler sendet ein GET. Er kann nicht das exakte POST nachspielen, das Ihr Browser geschickt hat, also sieht ein Handler, der nur $_POST-Felder liest, einen leeren Request und steigt früh aus. Für diese Fälle profilieren Sie die Admin-Seite, die den Aufruf abfeuert - die Boot-Callbacks, die jeder Ajax-Aufruf teilt, werden trotzdem gemessen.
  • Ein Nonce-geschützter Handler stirbt zuerst. Seine eigene Arbeit bleibt im profilierten Request ungemessen; alles drumherum - plugins_loaded, init, admin_init - wird trotzdem gemessen.
  • Loopback-HTTP ist Voraussetzung. Das Modul profiliert, indem es Ihre eigene Website aufruft - eine Firewall oder ein Hoster, der Loopback-Requests blockt, blockt auch den Profiler.
  • Find Slow Callbacks ist standardmäßig aus. Es installiert einen MU-Plugin-Profiler, also schalten Sie es ein, wenn Sie es brauchen - vorher läuft nichts.
  • Nichts davon drosselt Heartbeat oder setzt Ajax ein Limit. Die Module benennen den Callback und die Query; den Übeltäter zu entfernen, zu ersetzen oder zu melden bleibt Ihre Entscheidung.

FAQ zu admin-ajax.php

Warum ist admin-ajax.php in WordPress so langsam?

Jeder Aufruf ist ein kompletter WordPress-Bootstrap plus Handler. Ein Plugin, das auf init oder admin_init schwere Arbeit leistet, bremst jeden Aufruf, und eine langsame Query in einem Handler tut dasselbe für diese Action. Hohes Aufrufvolumen durch Heartbeat und Polling-Plugins multipliziert, was jeder Aufruf kostet.

Ist der admin-ajax.php-Traffic ein Angriff?

Meistens Ihr eigener Admin-Bereich. Der Heartbeat des Post-Editors postet etwa alle 15 Sekunden pro offenem Tab, und Dashboard-Widgets pollen im Takt - im Access-Log liest sich das exakt wie ein Dauerfeuer. Prüfen Sie den action-Parameter der Aufrufe; echte Fluten gibt es, aber Friendly Fire ist der Normalfall.

Kann ich admin-ajax.php einfach abschalten?

Nein. wp-admin hängt davon ab - Autosaves, Updates, die meisten interaktiven Screens - und viele Frontends ebenfalls. Den Endpoint zu blocken tauscht eine langsame Website gegen eine kaputte. Der langsame Callback oder der geschwätzige Aufrufer gehört gefixt.

Bremst die Heartbeat-API WordPress aus?

Heartbeat ist der häufigste Dauer-Aufrufer in wp-admin, und jeder Beat ist ein kompletter WordPress-Load - auf einer schweren Website zahlt jeder Beat die vollen Boot-Kosten. Nichts in WP Multitool drosselt ihn - der Profiler zeigt Ihnen stattdessen, was jeder Beat tatsächlich kostet.

Wie finde ich heraus, welches Plugin admin-ajax.php ausbremst?

Zwei Blickwinkel. Find Slow Callbacks misst jeden Callback in einem profilierten Request und sortiert sie mit Hook und Quelldatei, also benennt es das Plugin, das jeden Aufruf ausbremst. Slow Query Analyzer protokolliert die Queries, die ein Aufruf fährt, und markiert die über dem Schwellenwert mit EXPLAIN-Vorschlägen.

Spielt der Profiler den Ajax-Aufruf meines Browsers nach?

Nein - er sendet ein GET auf die URL, die Sie angeben, mit Ihren Admin-Cookies. Ein Handler, der POST-Felder oder eine gültige Nonce braucht, steigt früh aus - seine eigene Arbeit bleibt ungemessen, während der Boot drumherum trotzdem gemessen wird. Für diese Fälle profilieren Sie die Admin-Seite, die den Aufruf abfeuert.

Behebt ein Caching-Plugin eine langsame admin-ajax.php?

Nein. Ajax-Antworten sind dynamisch und absichtlich ungecacht, also fasst ein Page-Cache sie nie an. Jeder Aufruf zahlt volles PHP plus den Handler - darum ist der einzige echte Hebel, den Aufruf selbst billiger zu machen.

Benennen Sie den Callback hinter jedem AJAX-Aufruf

Find Slow Callbacks und Slow Query Analyzer sind Pro-Module - $79/Jahr für eine Website, und jeder bezahlte Plan enthält alle 19 Module. Schalten Sie den Profiler ein, wenn das Access-Log anfängt vollzulaufen.

Pro kaufen – ab $79/Jahr Anleitung: langsames wp-admin Alle Tarife auf der Preisseite →