Memory Management bei der Entwicklung von Plug-Ins

Ich habe eine Suche zu diesem Thema hier gemacht und es gibt viele Fragen zu Speicherproblemen und WordPress. Der allgemeine empfohlene Fix besteht darin, die WORDPRESS_MEMORY-Konstante zu ändern. Ich habe eine ähnliche Frage, und ich möchte die Notwendigkeit vermeiden, diese Konstante neu zu definieren. Hier ist meine Frage auf WordPress.org:

Ich entwickle ein Plug-in, das eine Reihe von benutzerdefinierten Abfragen enthält.

Ich suche nach einer Anleitung, wie man ein Problem am besten angehen kann, wenn das Plug-in funktioniert.

Nach der Aktivierung benötige ich eine Methode, um ALLE Posts, Seiten und benutzerdefinierten Post-Typen (CPT) durchzugehen und jedem Post, jeder Seite und jedem CPT 4 benutzerdefinierte Felder hinzuzufügen.

Hier ist der Code, den ich dafür verwende:

$internal = array( 'page', 'post' ); $cpt_args = array( 'public' => true, '_builtin' => false ); $custom = get_post_types( $cpt_args, 'objects' ); foreach ($custom as $name => $data) { $internal[] = $name; } $avail_posttypes = $internal; $args = array( 'post_type' => $avail_posttypes, 'post_status' => 'any', 'numberposts' => -1, 'cache_results' => false, 'no_found_rows' => true, 'fields' => 'ids', ); $all_posts = get_posts($args); foreach ($all_posts as $post) { if( !update_post_meta( $post->ID, '_cf_one', 'ok', true ) ){ add_post_meta( $post->ID, '_cf_one', 'ok', true ); } if( !update_post_meta( $post->ID, '_cf_two', 'ok', true ) ){ add_post_meta( $post->ID, '_cf_two', 'ok', true ); } if( !update_post_meta( $post->ID, '_cf_three', 'ok', true ) ){ add_post_meta( $post->ID, '_cf_three', 'ok', true ); } if( !update_post_meta( $post->ID, '_cf_four', 'ok', true ) ){ add_post_meta( $post->ID, '_cf_four', 'ok', true ); } } $img_args = array( 'post_type' => 'attachment', 'numberposts' => -1, 'cache_results' => false, 'no_found_rows' => true, 'fields' => 'ids', ); $img_posts = get_posts($img_args); foreach ($img_posts as $post) { if( !update_post_meta( $post->ID, '_cf_one', 'ok', true ) ){ add_post_meta( $post->ID, '_cf_one', 'ok', true ); } if( !update_post_meta( $post->ID, '_cf_two', 'ok', true ) ){ add_post_meta( $post->ID, '_cf_two', 'ok', true ); } if( !update_post_meta( $post->ID, '_cf_three', 'ok', true ) ){ add_post_meta( $post->ID, '_cf_three', 'ok', true ); } if( !update_post_meta( $post->ID, '_cf_four', 'ok', true ) ){ add_post_meta( $post->ID, '_cf_four', 'ok', true ); } } 

Ich habe versucht, meine Abfragen zu optimieren, um keine unnötigen Ressourcen zu verbrauchen. Aber es scheint, unseren Speicher auszuführen, bevor es an die Abfrage gelangt, um die Bilder zu verarbeiten.

Die spezielle Website, auf der ich diese Seite teste, hat über 600 Posts, Seiten und benutzerdefinierte Post-Typen (kombiniert).

Ich habe meine Speichereinstellung in wp-config.php geändert, um 128M zu sein. Aber ich würde gerne einen Weg finden, dies zu tun, so dass gewöhnliche Benutzer diesen Wert oder irgendetwas in der Datei php.ini nicht ändern müssen.

Kann ich noch mehr tun, um diese Anfrage zu optimieren? Gibt es eine Dokumentation darüber, wie WordPress Speicher in Beziehung zu Abfragen verwaltet?

Das Abfrageüberwachungs-Plugin zeigt außerdem an, dass ich ca. 37 MB Speicher benötige, wenn das Plug-in mit ca. 59 Abfragen aktiv ist. Ich möchte dies deutlich reduzieren, da der Speicher bei deaktiviertem Plugin auf 20M heruntergeht.

Ich möchte in der Lage sein, Speicher nach Bedarf zuzuordnen oder meine Abfragen so zu strukturieren, dass sie nicht so viel verbrauchen. Irgendwelche Vorschläge würden sehr geschätzt werden.

Solutions Collecting From Web of "Memory Management bei der Entwicklung von Plug-Ins"

Sie könnten versuchen, dieses Problem in Blöcken von Beiträgen anstatt von allen gleichzeitig anzugehen, Sie laden gerade alle Beiträge in den Speicher und dann fragen Sie die database mit diesen Posts ab, was nicht besonders effizient ist.

Sie könnten die Gesamtmenge der Post erhalten und sie dann in Blöcken von 25 oder etwas abfragen. Dann machen Sie Ihre Fragen und beginnen Sie erneut mit den nächsten 25.

Wenn Sie brauchen, könnte ich etwas Code aufpinseln, um meine Antwort zu illustrieren.

BEARBEITEN:
Ich habe ein Beispiel erstellt, das hoffentlich dein Problem triggers. Ich habe den ersten Block von Abfragen korrigiert. Wenn das funktioniert, können Sie (oder ich) es auf die gleiche Weise auf den zweiten Block anwenden.

Leider habe ich keine WordPress-Installation zur Hand, so dass es Bugs geben könnte. Ich bin mir auch nicht ganz sicher, ob wp_count_posts und $ avail_posttypes nett zusammenspielen.

 < ?php $internal = array( 'page', 'post' ); $cpt_args = array( 'public' => true, '_builtin' => false ); $custom = get_post_types( $cpt_args, 'objects' ); foreach ($custom as $name => $data) { $internal[] = $name; } $avail_posttypes = $internal; // Changed the numberposts to 25 to only query 25 posts, and added an offset. $args = array( 'post_type' => $avail_posttypes, 'post_status' => 'any', 'numberposts' => 25, 'offset' => 0, 'cache_results' => false, 'no_found_rows' => true, 'fields' => 'ids', ); $total_amount_of_posts = wp_count_posts($avail_posttypes); // Check if there are more post waiting if so then query them. while(args['offset']+args['numberposts']< $total_amount_of_posts) { // Get the next 25 posts. $posts = get_posts($args); foreach ($posts as $post) { if( !update_post_meta( $post->ID, '_cf_one', 'ok', true ) ){ add_post_meta( $post->ID, '_cf_one', 'ok', true ); } if( !update_post_meta( $post->ID, '_cf_two', 'ok', true ) ){ add_post_meta( $post->ID, '_cf_two', 'ok', true ); } if( !update_post_meta( $post->ID, '_cf_three', 'ok', true ) ){ add_post_meta( $post->ID, '_cf_three', 'ok', true ); } if( !update_post_meta( $post->ID, '_cf_four', 'ok', true ) ){ add_post_meta( $post->ID, '_cf_four', 'ok', true ); } } // Skip over the 25 we just queried. args['offset'] += 25; }