PHP RAM exhausted by class-wp-query: WordPress PHP Skript

FrazeColder

Lt. Commander
Registriert
Okt. 2013
Beiträge
1.718
Moin zusammen,

ich schreibe gerade ein PHP Skript für meine WordPress Seite. Dieses soll Produkte von meiner WordPress Seite löschen, welche nicht mehr in der Datenbank vorhanden sind. Das bedeutet, ich hole mir jeweils ein paar Daten und überprüfe die mit der Datenbank. Damit mein RAM eben nicht überbeansprucht wird, habe ich nun schon die Rows, welche sich die SQL Query holen soll, auf 100 limitiert. Dennoch bekomme ich immer noch die selbe Fehlermeldung.

Ich verstehe allerdings nicht wieso. Denn eigtl. müsste er doch die Daten im Ram überschreiben, sobald ich eine neue Anfrage mit 100 Rows an die Datenbank stelle. Anscheinend ja nicht... Kann man das aber irgendwie sagen?

Ich bekomme jedenfalls immer diese Fehlermeldung:
Code:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes) in /var/www/vhosts/httpdocs/wp-includes/class-wp-query.php on line 617

Meine Idee jetzt ist, nur die Funktionen welche ich benötige in mein Skript einzubinden, statt das komplette WordPress:
Code:
    if ( ! defined('ABSPATH') ) {
        // Set up WordPress environment 
        require_once( dirname( __FILE__ ) . '/wp-load.php' );
    }

Nun habe ich aber zwei Fragen an euch:

1. Ist es möglich nur die Funktionen `wp_delete_post()`, `get_the_ID()` und `get_the_title()` einzubinden? - Denn ich benötige gar nicht die WP Query Class, und viele andere Funktionen, weswegen mein Raum immer überlastet wird.
2. Hat jemand evtl. noch eine andere Idee, wie ich dieses Problem beheben kann?

Hier mein kompletter Post:
http://pastebin.com/8Dzx2xmJ

MfG und Vielen Dank!
 
Zeile 78, du holst alle Daten mit * nur um sie dann mit mysqli_num_rows zu zaehlen.
Lass doch die Datenbank zaehlen: SELECT COUNT(`ID`) FROM ...
Das kannst du ebenfalls in Zeile 17 machen, weil du diese Daten auch nur in Zeile 27 zaehlst.

Damit sparst du dann schonmal ein wenig. Aber du hast da noch eine ganze Menge unnuetzes Zeug drin.

Code:
$id = $row["ID"];
$pid = $id;
$pid = (string)$pid;

zu:
$pid = (string)$row["ID"];

Und was zu Geier soll das hier machen?

Code:
                    $var = 0; //False
                    array_push($deletePost, $var);


                    $var = 1; //True
                    array_push($deletePost, $var);



            if(array_sum($deletePost) >= 1){

            }elseif(array_sum($deletePost) == 0){
                fwrite($myfile, "Would: PID " . $pid . " Titel " . $title . "\n");
                //wp_delete_post($pid, TRUE);
            }else{
                fwrite($myfile, "\nEither true or false!\n");
            }

Soll das den Post loeschen wenn die Abfrage auf wp_all_import_xml nichts mehr hergibt?

Den Teil aus der for-Schleife mit dem $aktueller_counter (Zeile: 71) kannst du auch in die while-Schleife mit dem have_rows verschieben (Zeile 64).
Bitte dann aber mit gescheiften Klammern, nicht mit Doppelpunkt und endwhile...
Und dann die $i bei den get_field() durch $aktueller_counter ersetzen.
Dann hast du eine Schleife weniger.


Ausserdem laeuft deine Do-While-Schleife mit $count_values. Du deklarierst sie mit Zeile 27 und innerhalb der Schleife setzt einen anderen Wert (Zeile 79).
Das muesste eigentlich dein Problem beheben, wenn du eine davon umbenennst. (Sinnvoll! welche Werte zaehlst du damit? Erbsen, Nuesse? Vielleicht $posts_count und $products_count?)
 
Zuletzt bearbeitet:
Danke dir erst einmal r15ch13 :) - Ich werde das von dir umsetzten, bin aber gerade an einem anderen Lösungsweg dran.
Es liegt wohl nicht an WordPress oder an dem Include von den WordPress Funktionen, sondern an dem Plugin welches meine Custom Fields verarbeitet.

Denn oder den Aufruf davon, bekomme ich keinen Ram exthaused.
 
So ein Fehler kommt auch gerne mal bei einer Endlosscheife oder Rekursion.
Wo ist denn das $end definiert? Und die Berechnung von $count_values ist sehr ... unübersichtlich.
Schon mal überlegt, ob du das nicht in einem SQL-Statement machen kannst, ohne doppelt geschachtelte Schleifen?
Das Datenbandesign mit "product_shops_".$i."_price" halte ich für sehr suspekt, habe aber auch noch nichts mit WP gemacht.
 
Ich habe das jetzt extra mit Limit 100 gemacht und increase 100 nach jedem Loop, mit der Hoffnung, dass ich dann keinen exhausted Ram mehr bekomme. Funktioniert leider nicht.

Leider legt das Plugin die Postmetas so an. Von daher ist es mit nicht möglich, diese zu ändern und ich muss das über "product_shops_".$i."_price" machen. Ich habe auf jeden Fall daraus gelernt, dass ich un Zukunft keine Plugins mehr kaufe und das selber mache :D
 
Zurück
Oben