WordPress.org

Make WordPress Core

Ticket #18876: 18876.short-cache.patch

File 18876.short-cache.patch, 5.2 KB (added by kurtpayne, 6 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();