WordPress.org

Make WordPress Core

Ticket #18876: 18876.short-cache.patch

File 18876.short-cache.patch, 5.2 KB (added by kurtpayne, 7 years ago)

Short lived cache of updated responses

  • wp-includes/update.php

     
    3333                $current->updates = array();
    3434                $current->version_checked = $wp_version;
    3535        }
     36       
     37        // Wait 60 seconds between multiple version check requests
     38        $timeout = 60;
     39        $time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked );
     40        if ( $time_not_changed )
     41                return false;
    3642
    3743        $locale = apply_filters( 'core_version_check_locale', get_locale() );
    3844
     
    143149
    144150        $new_option = new stdClass;
    145151        $new_option->last_checked = time();
    146         // Check for updated every 60 minutes if hitting update pages; else, check every 12 hours.
    147         $timeout = in_array( current_filter(), array( 'load-plugins.php', 'load-update.php', 'load-update-core.php' ) ) ? 3600 : 43200;
    148         $time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked );
    149 
    150         $plugin_changed = false;
    151         foreach ( $plugins as $file => $p ) {
    152                 $new_option->checked[ $file ] = $p['Version'];
    153152
    154                 if ( !isset( $current->checked[ $file ] ) || strval($current->checked[ $file ]) !== strval($p['Version']) )
    155                         $plugin_changed = true;
     153        // Check for update on a different schedule, depending on the page.
     154        switch ( current_filter() ) {
     155                case 'load-update-core.php' :
     156                        $timeout = 60; // 1 min
     157                        break;
     158                case 'load-plugins.php' :
     159                case 'load-update.php' :
     160                        $timeout = 3600; // 1 hour
     161                        break;
     162                default :
     163                        $timeout = 43200; // 12 hours
    156164        }
     165       
     166        $time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked );
    157167
    158         if ( isset ( $current->response ) && is_array( $current->response ) ) {
    159                 foreach ( $current->response as $plugin_file => $update_details ) {
    160                         if ( ! isset($plugins[ $plugin_file ]) ) {
     168        if ( $time_not_changed ) {
     169                $plugin_changed = false;
     170                foreach ( $plugins as $file => $p ) {
     171                        $new_option->checked[ $file ] = $p['Version'];
     172
     173                        if ( !isset( $current->checked[ $file ] ) || strval($current->checked[ $file ]) !== strval($p['Version']) )
    161174                                $plugin_changed = true;
    162                                 break;
     175                }
     176
     177                if ( isset ( $current->response ) && is_array( $current->response ) ) {
     178                        foreach ( $current->response as $plugin_file => $update_details ) {
     179                                if ( ! isset($plugins[ $plugin_file ]) ) {
     180                                        $plugin_changed = true;
     181                                        break;
     182                                }
    163183                        }
    164184                }
    165         }
    166185
    167         // Bail if we've checked in the last 12 hours and if nothing has changed
    168         if ( $time_not_changed && !$plugin_changed )
    169                 return false;
     186                // Bail if we've checked recently and if nothing has changed
     187                if ( ! $plugin_changed )
     188                        return false;
     189        }
    170190
    171191        // Update last_checked for current to prevent multiple blocking requests if request hangs
    172192        $current->last_checked = time();
     
    222242        if ( ! is_object($last_update) )
    223243                $last_update = new stdClass;
    224244
    225         // Check for updated every 60 minutes if hitting update pages; else, check every 12 hours.
    226         $timeout = in_array( current_filter(), array( 'load-themes.php', 'load-update.php', 'load-update-core.php' ) ) ? 3600 : 43200;
    227         $time_not_changed = isset( $last_update->last_checked ) && $timeout > ( time( ) - $last_update->last_checked );
    228 
    229245        $themes = array();
    230246        $checked = array();
    231247        $exclude_fields = array('Template Files', 'Stylesheet Files', 'Status', 'Theme Root', 'Theme Root URI', 'Template Dir', 'Stylesheet Dir', 'Description', 'Tags', 'Screenshot');
     
    246262                }
    247263        }
    248264
    249         $theme_changed = false;
    250         foreach ( $checked as $slug => $v ) {
    251                 $update_request->checked[ $slug ] = $v;
    252 
    253                 if ( !isset( $last_update->checked[ $slug ] ) || strval($last_update->checked[ $slug ]) !== strval($v) )
    254                         $theme_changed = true;
     265        // Check for update on a different schedule, depending on the page.
     266        switch ( current_filter() ) {
     267                case 'load-update-core.php' :
     268                        $timeout = 60; // 1 min
     269                        break;
     270                case 'load-plugins.php' :
     271                case 'load-update.php' :
     272                        $timeout = 3600; // 1 hour
     273                        break;
     274                default :
     275                        $timeout = 43200; // 12 hours
    255276        }
     277       
     278        $time_not_changed = isset( $last_update->last_checked ) && $timeout > ( time( ) - $last_update->last_checked );
     279
     280        if ( $time_not_changed ) {
     281                $theme_changed = false;
     282                foreach ( $checked as $slug => $v ) {
     283                        $update_request->checked[ $slug ] = $v;
    256284
    257         if ( isset ( $last_update->response ) && is_array( $last_update->response ) ) {
    258                 foreach ( $last_update->response as $slug => $update_details ) {
    259                         if ( ! isset($checked[ $slug ]) ) {
     285                        if ( !isset( $last_update->checked[ $slug ] ) || strval($last_update->checked[ $slug ]) !== strval($v) )
    260286                                $theme_changed = true;
    261                                 break;
     287                }
     288
     289                if ( isset ( $last_update->response ) && is_array( $last_update->response ) ) {
     290                        foreach ( $last_update->response as $slug => $update_details ) {
     291                                if ( ! isset($checked[ $slug ]) ) {
     292                                        $theme_changed = true;
     293                                        break;
     294                                }
    262295                        }
    263296                }
    264         }
    265297
    266         if ( $time_not_changed && !$theme_changed )
    267                 return false;
     298                // Bail if we've checked recently and if nothing has changed
     299                if ( ! $theme_changed )
     300                        return false;
     301        }
    268302
    269303        // Update last_checked for current to prevent multiple blocking requests if request hangs
    270304        $last_update->last_checked = time();