Make WordPress Core


Ignore:
Timestamp:
02/17/2016 10:57:33 PM (9 years ago)
Author:
boonebgorges
Message:

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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/comment-template.php

    r36527 r36566  
    13931393     */
    13941394    $wp_query->comments = apply_filters( 'comments_array', $comments_flat, $post->ID );
    1395 
    1396     // Set up lazy-loading for comment metadata.
    1397     add_action( 'get_comment_metadata', array( $wp_query, 'lazyload_comment_meta' ), 10, 2 );
    13981395
    13991396    $comments = &$wp_query->comments;
     
    20302027    if ( null === $r['reverse_top_level'] )
    20312028        $r['reverse_top_level'] = ( 'desc' == get_option('comment_order') );
     2029
     2030    wp_queue_comments_for_comment_meta_lazyload( $_comments );
    20322031
    20332032    if ( empty( $r['walker'] ) ) {
Note: See TracChangeset for help on using the changeset viewer.