Make WordPress Core

02/17/2016 10:57:33 PM (8 years ago)

More performance improvements to metadata lazyloading.

Comment and term meta lazyloading for WP_Query loops, introduced in 4.4,
depended on filter callback methods belonging to WP_Query objects. This meant
storing WP_Query objects in the $wp_filter global (via add_filter()),
requiring that PHP retain the objects in memory, even when the local variables
would typically be expunged during normal garbage collection. In cases where a
large number of WP_Query objects were instantiated on a single pageload,
and/or where the contents of the WP_Query objects were quite large, serious
performance issues could result.

We skirt this problem by moving metadata lazyloading out of WP_Query. The
new WP_Metadata_Lazyloader class acts as a lazyload queue. Query instances
register items whose metadata should be lazyloaded - such as post terms, or
comments - and a WP_Metadata_Lazyloader method will intercept comment and
term meta requests to perform the cache priming. Since WP_Metadata_Lazyloader
instances are far smaller than WP_Query (containing only object IDs), and
clean up after themselves far better than the previous WP_Query methods (bp
only running their callbacks a single time for a given set of queued objects),
the resource use is decreased dramatically.

See [36525] for an earlier step in this direction.

Props lpawlik, stevegrunwell, boonebgorges.
Fixes #35816.

1 edited


  • trunk/src/wp-includes/comment.php

    r36542 r36566  
     472 * Queue comments for metadata lazyloading.
     473 *
     474 * @since 4.5.0
     475 *
     476 * @param array $comments Array of comment objects.
     477 */
     478function wp_queue_comments_for_comment_meta_lazyload( $comments ) {
     479    // Don't use `wp_list_pluck()` to avoid by-reference manipulation.
     480    $comment_ids = array();
     481    if ( is_array( $comments ) ) {
     482        foreach ( $comments as $comment ) {
     483            if ( $comment instanceof WP_Comment ) {
     484                $comment_ids[] = $comment->comment_ID;
     485            }
     486        }
     487    }
     489    if ( $comment_ids ) {
     490        $lazyloader = wp_metadata_lazyloader();
     491        $lazyloader->queue_objects( 'comment', $comment_ids );
     492    }
    472496 * Sets the cookies used to store an unauthenticated commentator's identity. Typically used
    473497 * to recall previous comments by this commentator that are still held in moderation.
Note: See TracChangeset for help on using the changeset viewer.