Jörgs Webnotizen

Speicherfresser WordPress

Ein PHP-Script, welches Produktdaten aus einer CSV-Datei in einen WooCommerce-Shop importieren sollte, lief auf meinem Testsystem anstandslos. Auf dem Webspace des Kunden brach das Script aber ab, weil das Speicherlimit des Webspace-Accounts überschritten war:

Allowed memory size of 104857600 bytes exhausted

Eine Messung mit memory_get_usage() auf meinem Testsystem ergab, dass das Script über 160 Megabyte verbrauchte, obwohl die CSV-Datei gerade einmal 6 Megabyte groß war. Diese wurde mit fgetcsv() in eine while Schleife Zeile für Zeile eingelesen, so dass daraus kein erhöhter Speicherbedarf resultierte.

Als Speicherfresser entpuppte sich schließlich WordPress. Da ich die Daten mittels wordpress-spezifischer Funktionen in die Datenbank schieben musste, habe ich WordPress mittels require('wp-load.php'); includiert. Dadurch allein wurden schon stolze 58 Megabyte in den Speicher geladen! wohl weil auch alle aktivierten Plugins mit geladen wurden, inklusive WooCommerce.

Die restlichen 100 Megabyte kamen durch den Gebrauch von update_post_meta() zustande – WordPress speichert die betreffenden Meta-Daten dabei nicht nur in der Datenbank ab, sondern legt diese auch in einem Cache ab. Nachdem ich das Script so geändert habe, dass die gecachten Daten mittels wp_cache_delete() nach jedem Speichern eines Datensatzes wieder freigegeben werden, sank der Speicherbedarf des Import-Scripts erheblich:


wp_cache_delete($product_id, 'posts');
wp_cache_delete($product_id, 'post_meta');
Tags: PHP, WordPress