Make WordPress Core

Ticket #5182: post_cache.diff

File post_cache.diff, 16.4 KB (added by ryan, 17 years ago)

Eliminates $page_cache, $post_cache, $post_meta_cache and unifies page and post caching

  • wp-app.php

     
    696696        }
    697697
    698698        function get_feed($page = 1, $post_type = 'post') {
    699                 global $post, $wp, $wp_query, $posts, $wpdb, $blog_id, $post_cache;
     699                global $post, $wp, $wp_query, $posts, $wpdb, $blog_id;
    700700                log_app('function',"get_feed($page, '$post_type')");
    701701                ob_start();
    702702
     
    715715                $wp_query = $GLOBALS['wp_query'];
    716716                $wpdb = $GLOBALS['wpdb'];
    717717                $blog_id = (int) $GLOBALS['blog_id'];
    718                 $post_cache = $GLOBALS['post_cache'];
    719718                log_app('function',"query_posts(# " . print_r($wp_query, true) . "#)");
    720719
    721720                log_app('function',"total_count(# $wp_query->max_num_pages #)");
     
    756755        function get_entry($postID, $post_type = 'post') {
    757756                log_app('function',"get_entry($postID, '$post_type')");
    758757                ob_start();
    759                 global $posts, $post, $wp_query, $wp, $wpdb, $blog_id, $post_cache;
     758                global $posts, $post, $wp_query, $wp, $wpdb, $blog_id;
    760759                switch($post_type) {
    761760                        case 'post':
    762761                                $varname = 'p';
  • wp-includes/post.php

     
    2626}
    2727
    2828function &get_children($args = '', $output = OBJECT) {
    29         global $post_cache, $wpdb, $blog_id;
     29        global $wpdb;
    3030
    3131        if ( empty( $args ) ) {
    3232                if ( isset( $GLOBALS['post'] ) ) {
     
    4949
    5050        $children = get_posts( $r );
    5151
    52         if ( $children ) {
    53                 foreach ( $children as $key => $child ) {
    54                         $post_cache[$blog_id][$child->ID] =& $children[$key];
    55                         $kids[$child->ID] =& $children[$key];
    56                 }
    57         } else {
     52        if ( !$children )
    5853                return false;
    59         }
    6054
     55        update_post_cache($children);
     56
     57        foreach ( $children as $key => $child )
     58                $kids[$child->ID] =& $children[$key];
     59
    6160        if ( $output == OBJECT ) {
    6261                return $kids;
    6362        } elseif ( $output == ARRAY_A ) {
     
    9392// Retrieves post data given a post ID or post object.
    9493// Handles post caching.
    9594function &get_post(&$post, $output = OBJECT, $filter = 'raw') {
    96         global $post_cache, $wpdb, $blog_id;
     95        global $wpdb;
    9796
    9897        if ( empty($post) ) {
    9998                if ( isset($GLOBALS['post']) )
    10099                        $_post = & $GLOBALS['post'];
    101100                else
    102                         $_post = null;
     101                        return null;
    103102        } elseif ( is_object($post) ) {
    104                 if ( 'page' == $post->post_type )
    105                         return get_page($post, $output, $filter);
    106                 if ( !isset($post_cache[$blog_id][$post->ID]) )
    107                         $post_cache[$blog_id][$post->ID] = &$post;
    108                 $_post = & $post_cache[$blog_id][$post->ID];
     103                wp_cache_add($post->ID, $post, 'posts');
     104                $_post = &$post;
    109105        } else {
    110106                $post = (int) $post;
    111                 if ( isset($post_cache[$blog_id][$post]) )
    112                         $_post = & $post_cache[$blog_id][$post];
    113                 elseif ( $_post = wp_cache_get($post, 'pages') )
    114                         return get_page($_post, $output, $filter);
    115                 else {
     107                if ( ! $_post = wp_cache_get($post, 'posts') ) {
    116108                        $_post = & $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1", $post));
    117                         if ( 'page' == $_post->post_type )
    118                                 return get_page($_post, $output, $filter);
    119                         $post_cache[$blog_id][$post] = & $_post;
     109                        wp_cache_add($_post->ID, $_post, 'posts');
    120110                }
    121111        }
    122112
    123         if ( defined('WP_IMPORTING') )
    124                 unset($post_cache[$blog_id]);
    125 
    126113        $_post = sanitize_post($_post, $filter);
    127114
    128115        if ( $output == OBJECT ) {
     
    273260//
    274261
    275262function add_post_meta($post_id, $key, $value, $unique = false) {
    276         global $wpdb, $post_meta_cache, $blog_id;
     263        global $wpdb;
    277264
    278265        if ( $unique ) {
    279266                // expected_slashed ($key)
     
    282269                }
    283270        }
    284271
    285         $post_meta_cache[$blog_id][$post_id][$key][] = $value;
     272        $cache = wp_cache_get($post_id, 'post_meta');
     273        if ( ! is_array($cache) )
     274                $cache = array();
     275        $cache[$key][] = $value;
    286276
     277        wp_cache_set($post_id, $cache, 'post_meta');
     278
    287279        $value = maybe_serialize($value);
    288280
    289281        // expected_slashed ($key)
     
    293285}
    294286
    295287function delete_post_meta($post_id, $key, $value = '') {
    296         global $wpdb, $post_meta_cache, $blog_id;
     288        global $wpdb;
    297289
    298290        if ( empty($value) ) {
    299291                // expected_slashed ($key)
     
    309301        if ( empty($value) ) {
    310302                // expected_slashed ($key)
    311303                $wpdb->query($wpdb->prepare("DELETE FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = '$key'", $post_id));
    312                 unset($post_meta_cache[$blog_id][$post_id][$key]);
    313304        } else {
    314305                // expected_slashed ($key, $value)
    315306                $wpdb->query($wpdb->prepare("DELETE FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = '$key' AND meta_value = '$value'", $post_id));
    316                 $cache_key = $post_meta_cache[$blog_id][$post_id][$key];
    317                 if ($cache_key) foreach ( $cache_key as $index => $data )
    318                         if ( $data == $value )
    319                                 unset($post_meta_cache[$blog_id][$post_id][$key][$index]);
    320307        }
    321308
    322         unset($post_meta_cache[$blog_id][$post_id][$key]);
     309        wp_cache_delete($post_id, 'post_meta');
    323310
    324311        return true;
    325312}
    326313
    327314function get_post_meta($post_id, $key, $single = false) {
    328         global $wpdb, $post_meta_cache, $blog_id;
     315        global $wpdb;
    329316
    330317        $post_id = (int) $post_id;
    331318
    332         if ( isset($post_meta_cache[$blog_id][$post_id][$key]) ) {
     319        $meta_cache = wp_cache_get($post_id, 'post_meta');
     320
     321        if ( isset($meta_cache[$key]) ) {
    333322                if ( $single ) {
    334                         return maybe_unserialize( $post_meta_cache[$blog_id][$post_id][$key][0] );
     323                        return maybe_unserialize( $meta_cache[$key][0] );
    335324                } else {
    336                         return maybe_unserialize( $post_meta_cache[$blog_id][$post_id][$key] );
     325                        return maybe_unserialize( $meta_cache[$key] );
    337326                }
    338327        }
    339328
    340         if ( !isset($post_meta_cache[$blog_id][$post_id]) )
     329        if ( !$meta_cache ) {
    341330                update_postmeta_cache($post_id);
     331                $meta_cache = wp_cache_get($post_id, 'post_meta');
     332        }
    342333
    343334        if ( $single ) {
    344                 if ( isset($post_meta_cache[$blog_id][$post_id][$key][0]) )
    345                         return maybe_unserialize($post_meta_cache[$blog_id][$post_id][$key][0]);
     335                if ( isset($meta_cache[$key][0]) )
     336                        return maybe_unserialize($meta_cache[$key][0]);
    346337                else
    347338                        return '';
    348         }       else {
    349                 return maybe_unserialize($post_meta_cache[$blog_id][$post_id][$key]);
     339        } else {
     340                return maybe_unserialize($meta_cache[$key]);
    350341        }
    351342}
    352343
    353344function update_post_meta($post_id, $key, $value, $prev_value = '') {
    354         global $wpdb, $post_meta_cache, $blog_id;
     345        global $wpdb;
    355346
    356347        $original_value = $value;
    357348        $value = maybe_serialize($value);
     
    367358        if ( empty($prev_value) ) {
    368359                // expected_slashed ($key)
    369360                $wpdb->query($wpdb->prepare("UPDATE $wpdb->postmeta SET meta_value = %s WHERE meta_key = '$key' AND post_id = %d", $value, $post_id));
    370                 $cache_key = $post_meta_cache[$blog_id][$post_id][$key];
    371                 if ( !empty($cache_key) )
    372                         foreach ($cache_key as $index => $data)
    373                                 $post_meta_cache[$blog_id][$post_id][$key][$index] = $original_value;
    374361        } else {
    375362                // expected_slashed ($key)
    376363                $wpdb->query($wpdb->prepare("UPDATE $wpdb->postmeta SET meta_value = %s WHERE meta_key = '$key' AND post_id = %d AND meta_value = %s", $value, $post_id, $prev_value));
    377                 $cache_key = $post_meta_cache[$blog_id][$post_id][$key];
    378                 if ( !empty($cache_key) )
    379                         foreach ($cache_key as $index => $data)
    380                                 if ( $data == $original_prev )
    381                                         $post_meta_cache[$blog_id][$post_id][$key][$index] = $original_value;
    382364        }
    383365
     366        wp_cache_delete($post_id, 'post_meta');
     367
    384368        return true;
    385369}
    386370
    387371
    388372function delete_post_meta_by_key($post_meta_key) {
    389         global $wpdb, $post_meta_cache, $blog_id;
     373        global $wpdb;
    390374        if ( $wpdb->query($wpdb->prepare("DELETE FROM $wpdb->postmeta WHERE meta_key = %s", $post_meta_key)) ) {
    391                 unset($post_meta_cache[$blog_id]); // not worth doing the work to iterate through the cache
     375                // TODO Get post_ids and delete cache
     376                // wp_cache_delete($post_id, 'post_meta');
    392377                return true;
    393378        }
    394379        return false;
     
    396381
    397382
    398383function get_post_custom($post_id = 0) {
    399         global $id, $post_meta_cache, $wpdb, $blog_id;
     384        global $id, $wpdb;
    400385
    401386        if ( !$post_id )
    402387                $post_id = (int) $id;
    403388
    404389        $post_id = (int) $post_id;
    405390
    406         if ( !isset($post_meta_cache[$blog_id][$post_id]) )
     391        if ( ! wp_cache_get($post_id, 'post_meta') )
    407392                update_postmeta_cache($post_id);
    408393
    409         return $post_meta_cache[$blog_id][$post_id];
     394        return wp_cache_get($post_id, 'post_meta');
    410395}
    411396
    412397function get_post_custom_keys( $post_id = 0 ) {
     
    977962// Retrieves page data given a page ID or page object.
    978963// Handles page caching.
    979964function &get_page(&$page, $output = OBJECT, $filter = 'raw') {
    980         global $wpdb, $blog_id;
    981 
    982965        if ( empty($page) ) {
    983                 if ( isset( $GLOBALS['page'] ) && isset( $GLOBALS['page']->ID ) ) {
    984                         $_page = & $GLOBALS['page'];
    985                         wp_cache_add($_page->ID, $_page, 'pages');
    986                 } else {
    987                         // shouldn't we just return NULL at this point? ~ Mark
    988                         $_page = null;
    989                 }
    990         } elseif ( is_object($page) ) {
    991                 if ( 'post' == $page->post_type )
    992                         return get_post($page, $output, $filter);
    993                 wp_cache_add($page->ID, $page, 'pages');
    994                 $_page = $page;
    995         } else {
    996                 $page = (int) $page;
    997                 // first, check the cache
    998                 if ( ! ( $_page = wp_cache_get($page, 'pages') ) ) {
    999                         // not in the page cache?
    1000                         if ( isset($GLOBALS['page']->ID) && ($page == $GLOBALS['page']->ID) ) { // for is_page() views
    1001                                 // I don't think this code ever gets executed ~ Mark
    1002                                 $_page = & $GLOBALS['page'];
    1003                                 wp_cache_add($_page->ID, $_page, 'pages');
    1004                         } elseif ( isset($GLOBALS['post_cache'][$blog_id][$page]) ) { // it's actually a page, and is cached
    1005                                 return get_post($page, $output, $filter);
    1006                         } else { // it's not in any caches, so off to the DB we go
    1007                                 // Why are we using assignment for this query?
    1008                                 $_page = & $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID= %d LIMIT 1", $page ));
    1009                                 if ( 'post' == $_page->post_type )
    1010                                         return get_post($_page, $output, $filter);
    1011                                 // Potential issue: we're not checking to see if the post_type = 'page'
    1012                                 // So all non-'post' posts will get cached as pages.
    1013                                 wp_cache_add($_page->ID, $_page, 'pages');
    1014                         }
    1015                 }
     966                if ( isset( $GLOBALS['page'] ) && isset( $GLOBALS['page']->ID ) )
     967                        return get_post($GLOBALS['page'], $output, $filter);
     968                else
     969                        return null;
    1016970        }
    1017971
    1018         $_page = sanitize_post($_page, $filter);
    1019 
    1020         // at this point, one way or another, $_post contains the page object
    1021 
    1022         if ( $output == OBJECT ) {
    1023                 return $_page;
    1024         } elseif ( $output == ARRAY_A ) {
    1025                 return get_object_vars($_page);
    1026         } elseif ( $output == ARRAY_N ) {
    1027                 return array_values(get_object_vars($_page));
    1028         } else {
    1029                 return $_page;
    1030         }
     972        return get_post($page, $output, $filter);
    1031973}
    1032974
    1033975function get_page_by_path($page_path, $output = OBJECT) {
     
    10711013}
    10721014
    10731015function &get_page_children($page_id, $pages) {
    1074         global $page_cache, $blog_id;
    1075 
    1076         if ( empty($pages) )
    1077                 $pages = &$page_cache[$blog_id];
    1078 
    10791016        $page_list = array();
    10801017        foreach ( $pages as $page ) {
    10811018                if ( $page->post_parent == $page_id ) {
     
    16941631//
    16951632
    16961633function update_post_cache(&$posts) {
    1697         global $post_cache, $blog_id;
    1698 
    16991634        if ( !$posts )
    17001635                return;
    17011636
    1702         for ($i = 0; $i < count($posts); $i++) {
    1703                 $post_cache[$blog_id][$posts[$i]->ID] = &$posts[$i];
    1704         }
     1637        foreach ( $posts as $post )
     1638                wp_cache_add($post->ID, $post, 'posts');
    17051639}
    17061640
    17071641function clean_post_cache($id) {
    1708         global $post_cache, $post_meta_cache, $post_term_cache, $blog_id;
     1642        wp_cache_delete($id, 'posts');
     1643        wp_cache_delete($id, 'post_meta');
    17091644
    1710         if ( isset( $post_cache[$blog_id][$id] ) )
    1711                 unset( $post_cache[$blog_id][$id] );
    1712 
    1713         if ( isset ($post_meta_cache[$blog_id][$id] ) )
    1714                 unset( $post_meta_cache[$blog_id][$id] );
    1715 
    17161645        clean_object_term_cache($id, 'post');
    17171646}
    17181647
    17191648function update_page_cache(&$pages) {
    1720         global $page_cache, $blog_id;
    1721 
    1722         if ( !$pages )
    1723                 return;
    1724 
    1725         for ($i = 0; $i < count($pages); $i++) {
    1726                 $page_cache[$blog_id][$pages[$i]->ID] = &$pages[$i];
    1727                 wp_cache_add($pages[$i]->ID, $pages[$i], 'pages');
    1728         }
     1649        update_post_cache($pages);
    17291650}
    17301651
    17311652function clean_page_cache($id) {
    1732         global $page_cache, $blog_id;
     1653        clean_post_cache($id);
    17331654
    1734         if ( isset( $page_cache[$blog_id][$id] ) )
    1735                 unset( $page_cache[$blog_id][$id] );
    1736 
    1737         wp_cache_delete($id, 'pages');
    17381655        wp_cache_delete( 'all_page_ids', 'pages' );
    17391656        wp_cache_delete( 'get_pages', 'page' );
    17401657}
    17411658
    17421659function update_post_caches(&$posts) {
    1743         global $post_cache;
    1744         global $wpdb, $blog_id;
     1660        global $wpdb;
    17451661
    17461662        // No point in doing all this work if we didn't match any posts.
    17471663        if ( !$posts )
    17481664                return;
    17491665
    1750         // Get the categories for all the posts
    1751         for ($i = 0; $i < count($posts); $i++) {
    1752                 $post_id_array[] = $posts[$i]->ID;
    1753                 $post_cache[$blog_id][$posts[$i]->ID] = &$posts[$i];
    1754         }
     1666        update_post_cache($posts);
    17551667
    1756         $post_id_list = implode(',', $post_id_array);
     1668        $post_ids = array();
    17571669
    1758         update_object_term_cache($post_id_list, 'post');
     1670        for ($i = 0; $i < count($posts); $i++)
     1671                $post_ids[] = $posts[$i]->ID;
    17591672
    1760         update_postmeta_cache($post_id_list);
     1673        update_object_term_cache($post_ids, 'post');
     1674
     1675        update_postmeta_cache($post_ids);
    17611676}
    17621677
    1763 function update_postmeta_cache($post_id_list = '') {
    1764         global $wpdb, $post_meta_cache, $blog_id;
     1678function update_postmeta_cache($post_ids) {
     1679        global $wpdb;
    17651680
    1766         // We should validate this comma-separated list for the upcoming SQL query
    1767         $post_id_list = preg_replace('|[^0-9,]|', '', $post_id_list);
    1768 
    1769         if ( empty( $post_id_list ) )
     1681        if ( empty( $post_ids ) )
    17701682                return false;
    17711683
    1772         // we're marking each post as having its meta cached (with no keys... empty array), to prevent posts with no meta keys from being queried again
    1773         // any posts that DO have keys will have this empty array overwritten with a proper array, down below
    1774         $post_id_array = (array) explode(',', $post_id_list);
    1775         $count = count( $post_id_array);
    1776         for ( $i = 0; $i < $count; $i++ ) {
    1777                 $post_id = (int) $post_id_array[ $i ];
    1778                 if ( isset( $post_meta_cache[$blog_id][$post_id] ) ) { // If the meta is already cached
    1779                         unset( $post_id_array[ $i ] );
    1780                         continue;
    1781                 }
    1782                 $post_meta_cache[$blog_id][$post_id] = array();
     1684        $ids = array();
     1685        foreach ( $post_ids as $id ) {
     1686                if ( false === wp_cache_get($id, 'post_meta') )
     1687                        $ids[] = $id;
    17831688        }
    1784         if ( count( $post_id_array ) == 0 )
    1785                 return;
    1786         $post_id_list = join( ',', $post_id_array ); // with already cached stuff removeds
    17871689
    1788         // Get post-meta info
    1789         if ( $meta_list = $wpdb->get_results("SELECT post_id, meta_key, meta_value FROM $wpdb->postmeta WHERE post_id IN($post_id_list) ORDER BY post_id, meta_key", ARRAY_A) ) {
    1790                 // Change from flat structure to hierarchical:
    1791                 if ( !isset($post_meta_cache) )
    1792                         $post_meta_cache[$blog_id] = array();
     1690        if ( empty( $ids ) )
     1691                return false;
    17931692
     1693        // Get post-meta info
     1694        $id_list = join(',', $ids);
     1695        $cache = array();
     1696        if ( $meta_list = $wpdb->get_results("SELECT post_id, meta_key, meta_value FROM $wpdb->postmeta WHERE post_id IN ($id_list) ORDER BY post_id, meta_key", ARRAY_A) ) {
    17941697                foreach ($meta_list as $metarow) {
    17951698                        $mpid = (int) $metarow['post_id'];
    17961699                        $mkey = $metarow['meta_key'];
    17971700                        $mval = $metarow['meta_value'];
    17981701
    17991702                        // Force subkeys to be array type:
    1800                         if ( !isset($post_meta_cache[$blog_id][$mpid]) || !is_array($post_meta_cache[$blog_id][$mpid]) )
    1801                                 $post_meta_cache[$blog_id][$mpid] = array();
    1802                         if ( !isset($post_meta_cache[$blog_id][$mpid]["$mkey"]) || !is_array($post_meta_cache[$blog_id][$mpid]["$mkey"]) )
    1803                                 $post_meta_cache[$blog_id][$mpid]["$mkey"] = array();
     1703                        if ( !isset($cache[$mpid]) || !is_array($cache[$mpid]) )
     1704                                $cache[$mpid] = array();
     1705                        if ( !isset($cache[$mpid][$mkey]) || !is_array($cache[$mpid][$mkey]) )
     1706                                $cache[$mpid][$mkey] = array();
    18041707
    18051708                        // Add a value to the current pid/key:
    1806                         $post_meta_cache[$blog_id][$mpid][$mkey][] = $mval;
     1709                        $cache[$mpid][$mkey][] = $mval;
    18071710                }
    18081711        }
     1712
     1713        foreach ( $ids as $id ) {
     1714                if ( ! isset($cache[$id]) )
     1715                        $cache[$id] = array();
     1716        }
     1717
     1718        foreach ( array_keys($cache) as $post)
     1719                wp_cache_set($post, $cache[$post], 'post_meta');
     1720
     1721        return $cache;
    18091722}
    18101723
    18111724//
  • wp-admin/includes/post.php

     
    348348                if ( in_array($metakey, $protected) )
    349349                        return false;
    350350
     351                wp_cache_delete($post_ID, 'post_meta');
     352
    351353                $result = $wpdb->query( "
    352354                                                INSERT INTO $wpdb->postmeta
    353355                                                (post_id,meta_key,meta_value )
     
    362364        global $wpdb;
    363365        $mid = (int) $mid;
    364366
     367        $post_id = $wpdb->get_var("SELECT post_id FROM $wpdb->postmeta WHERE meta_id = '$mid'");
     368        wp_cache_delete($post_id, 'post_meta');
     369
    365370        return $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE meta_id = '$mid'" );
    366371}
    367372
     
    408413        if ( in_array($mkey, $protected) )
    409414                return false;
    410415
     416        $post_id = $wpdb->get_var("SELECT post_id FROM $wpdb->postmeta WHERE meta_id = '$mid'");
     417        wp_cache_delete($post_id, 'post_meta');
     418
    411419        $mvalue = maybe_serialize( stripslashes( $mvalue ));
    412420        $mvalue = $wpdb->escape( $mvalue );
    413421        $mid = (int) $mid;