precache comments done, tests done; separated admin part for commands added
Peter Molnar hello@petermolnar.eu
Wed, 27 Mar 2013 11:51:25 +0000
3 files changed,
131 insertions(+),
17 deletions(-)
M
readme.txt
→
readme.txt
@@ -26,6 +26,7 @@ * shortlink HTTP header preservation
* pingback HTTP header preservation * (optional) talkative log for troubleshooting * multiple memcached upstream support +* possibility of precaching ( requires permalinks ) Many thanks for supporters, testers & bug reporters: [Eric Gilette](http://www.ericgillette.com/ "Eric Gilette"); [doconeill](http://wordpress.org/support/profile/doconeill "doconeill"); [Mark Costlow](mailto:cheeks@swcp.com "Mark Costlow").@@ -87,8 +88,8 @@
= 1.1 = *under development* -* added validate caching "noob" method: HTML comment option for cache engine & generation before closing "body" tag -* pre-cache possibility +* HTML comment option for displaying cache info before closing "body" tag ( a.k.a make sure it works "noob" method ) +* precache engine * bugfix for status check ( there were situations where the status was not updated correctly ) = 1.0 =
M
wp-ffpc-admin.css
→
wp-ffpc-admin.css
@@ -132,3 +132,63 @@ background-image: -o-linear-gradient(bottom,#ececec,#f9f9f9);
background-image: linear-gradient(to top,#ececec,#f9f9f9); outline: none; } + + +.button-warning { + display: inline-block; + text-decoration: none; + font-size: 12px; + line-height: 23px; + height: 24px; + margin: 0; + padding: 0 10px 1px; + cursor: pointer; + border-width: 1px; + border-style: solid; + -webkit-border-radius: 3px; + -webkit-appearance: none; + border-radius: 3px; + white-space: nowrap; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + background: #f3f3f3; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fefefe), to(#f4f4f4)); + background-image: -webkit-linear-gradient(top, #fefefe, #f4f4f4); + background-image: -moz-linear-gradient(top, #fefefe, #f4f4f4); + background-image: -o-linear-gradient(top, #fefefe, #f4f4f4); + background-image: linear-gradient(to bottom, #fefefe, #f4f4f4); + border-color: #bbb; + color: #900; + text-shadow: 0 1px 0 #fff; +} + +.button-warning:hover, +.button-warning:focus { + background: #f3f3f3; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f3f3f3)); + background-image: -webkit-linear-gradient(top, #fff, #f3f3f3); + background-image: -moz-linear-gradient(top, #fff, #f3f3f3); + background-image: -ms-linear-gradient(top, #fff, #f3f3f3); + background-image: -o-linear-gradient(top, #fff, #f3f3f3); + background-image: linear-gradient(to bottom, #fff, #f3f3f3); + border-color: #900; + color: #a00; + -webkit-box-shadow: 1px 1px 1px rgba(0,0,0,.2); + box-shadow: 1px 1px 1px rgba(0,0,0,.2); +} + +.button-warning:active { + background: #eee; + background-image: -webkit-gradient(linear, left top, left bottom, from(#f4f4f4), to(#fefefe)); + background-image: -webkit-linear-gradient(top, #f4f4f4, #fefefe); + background-image: -moz-linear-gradient(top, #f4f4f4, #fefefe); + background-image: -ms-linear-gradient(top, #f4f4f4, #fefefe); + background-image: -o-linear-gradient(top, #f4f4f4, #fefefe); + background-image: linear-gradient(to bottom, #f4f4f4, #fefefe); + border-color: #900; + color: #a00; + text-shadow: 0 -1px 0 #fff; + -webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ); + box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ); +}
M
wp-ffpc-class.php
→
wp-ffpc-class.php
@@ -224,6 +224,7 @@
<script> jQuery(document).ready(function($) { jQuery( "#<?php echo $this->plugin_constant ?>-settings" ).tabs(); + jQuery( "#<?php echo $this->plugin_constant ?>-commands" ).tabs(); }); </script>@@ -264,13 +265,6 @@ * if options were saved, display saved message
*/ if ($_GET[ self::key_precache ]=='true' || $this->status == 4) : ?> <div class='updated settings-error'><p><strong><?php _e( 'Precache process was started, it is now running in the background, please be patient, it may take a very long time to finish.' , $this->plugin_constant ) ?></strong></p></div> - <?php endif; - - /** - * if options were saved, display saved message - */ - if ( $_GET[ self::key_precache_disabled ]=='true' || $this->status == 5 || $this->shell_function == false ) : ?> - <div class='error'><p><strong><?php _e( "Precache functionality is disabled due to unavailable system call function. <br />Since precaching may take a very long time, it's done through a background CLI process in order not to run out of max execution time of PHP. Please enable one of the following functions if you whish to use precaching: " , $this->plugin_constant ) ?><?php echo join( ',' , $this->shell_possibilities ); ?></strong></p></div> <?php endif; /**@@ -571,14 +565,55 @@ </fieldset>
<p class="clear"> <input class="button-primary" type="submit" name="<?php echo $this->button_save ?>" id="<?php echo $this->button_save ?>" value="<?php _e('Save Changes', $this->plugin_constant ) ?>" /> - <?php $disabled = ( $this->shell_function == false ) ? 'disabled="disabled"' : '' ; ?> - <input <?php echo $disabled ?> class="button-primary" type="submit" name="<?php echo $this->button_precache ?>" id="<?php echo $this->button_precache ?>" value="<?php _e('Pre-cache post-like entries', $this->plugin_constant ) ?>" /> + </p> + + </form> - <input class="button-secondary error" style="float: right" type="submit" name="<?php echo $this->button_flush ?>" id="<?php echo $this->button_flush ?>" value="<?php _e('Clear cache', $this->plugin_constant ) ?>" /> - <input class="button-secondary error" style="float: right" type="submit" name="<?php echo $this->button_delete ?>" id="<?php echo $this->button_delete ?>" value="<?php _e('Delete options from DB', $this->plugin_constant ) ?>" /> + <form method="post" action="#" id="<?php echo $this->plugin_constant ?>-commands" class="plugin-admin" style="padding-top:2em;"> - </p> + <ul class="tabs"> + <li><a href="#<?php echo $this->plugin_constant ?>-precache" class="wp-switch-editor"><?php _e( 'Precache', $this->plugin_constant ); ?></a></li> + <li><a href="#<?php echo $this->plugin_constant ?>-flush" class="wp-switch-editor"><?php _e( 'Empty cache', $this->plugin_constant ); ?></a></li> + <li><a href="#<?php echo $this->plugin_constant ?>-reset" class="wp-switch-editor"><?php _e( 'Reset settings', $this->plugin_constant ); ?></a></li> + </ul> + <fieldset id="<?php echo $this->plugin_constant ?>-precache"> + <legend><?php _e( 'Precache', $this->plugin_constant ); ?></legend> + <dl> + <dt> + <?php if ( $_GET[ self::key_precache_disabled ]=='true' || $this->status == 5 || $this->shell_function == false ) : ?> + <strong><?php _e( "Precache functionality is disabled due to unavailable system call function. <br />Since precaching may take a very long time, it's done through a background CLI process in order not to run out of max execution time of PHP. Please enable one of the following functions if you whish to use precaching: " , $this->plugin_constant ) ?><?php echo join( ',' , $this->shell_possibilities ); ?></strong> + <?php else: ?> + <input class="button-secondary" type="submit" name="<?php echo $this->button_precache ?>" id="<?php echo $this->button_precache ?>" value="<?php _e('Pre-cache', $this->plugin_constant ) ?>" /> + <?php endif; ?> + </dt> + <dd> + <span class="description"><?php _e('Start a background process that visits all permalinks of all blogs it can found thus forces WordPress to generate cached version of all the pages.', $this->plugin_constant); ?></span> + </dd> + </dl> + </fieldset> + <fieldset id="<?php echo $this->plugin_constant ?>-flush"> + <legend><?php _e( 'Precache', $this->plugin_constant ); ?></legend> + <dl> + <dt> + <input class="button-warning" type="submit" name="<?php echo $this->button_flush ?>" id="<?php echo $this->button_flush ?>" value="<?php _e('Clear cache', $this->plugin_constant ) ?>" /> + </dt> + <dd> + <span class="description"><?php _e ( "Clear all entries in the storage, including the ones that were set by other processes.", $this->plugin_constant ); ?> </span> + </dd> + </dl> + </fieldset> + <fieldset id="<?php echo $this->plugin_constant ?>-reset"> + <legend><?php _e( 'Precache', $this->plugin_constant ); ?></legend> + <dl> + <dt> + <input class="button-warning" type="submit" name="<?php echo $this->button_delete ?>" id="<?php echo $this->button_delete ?>" value="<?php _e('Reset options', $this->plugin_constant ) ?>" /> + </dt> + <dd> + <span class="description"><?php _e ( "Reset settings to defaults.", $this->plugin_constant ); ?> </span> + </dd> + </dl> + </fieldset> </form> </div> <?php@@ -772,27 +807,37 @@ update_site_option( $this->global_option , $this->global_config );
} /** - * generate cache entry for every available permalink, might be very-very slow + * generate cache entry for every available permalink, might be very-very slow, + * therefore it starts a background process * */ private function precache () { - /* container for links to precache */ + /* container for links to precache, well be accessed by reference */ $links = array(); + /* when plugin is network wide active, we need to pre-cache for all link of all blogs */ if ( $this->network ) { + /* list all blogs */ $blog_list = get_blog_list( 0, 'all' ); foreach ($blog_list as $blog) { + /* get permalinks for this blog */ $this->precache_list_permalinks ( $links, $blog['blog_id'] ); } } else { + /* no network, better */ $this->precache_list_permalinks ( $links, false ); } + /* temporary php file, will destroy itself after finish in order to clean up */ $tmpfile = tempnam(sys_get_temp_dir(), 'wp-ffpc'); + /* double check if we do have any links to pre-cache */ if ( !empty ( $links ) ) : + /* this is the precacher php worker file: logs the links, their generation time and the generated content size + * writes the logfile and destroys itself afterwards + */ $out .= '<?php $links = ' . var_export ( $links , true ) . ';@@ -815,6 +860,7 @@ unlink ( "'. $tmpfile .'" );
?>'; file_put_contents ( $tmpfile, $out ); + /* call the precache worker file in the background */ $shellfunction = $this->shell_function; $shellfunction( 'php '. $tmpfile .' >'. $this->precache_logfile .' 2>&1 &' );@@ -827,25 +873,29 @@ * gets all post-like entry permalinks for a site, returns values in passed-by-reference array
* */ private function precache_list_permalinks ( &$links, $site = false ) { + /* $post will be populated when running throught the posts */ global $post; include_once ( ABSPATH . "wp-load.php" ); + /* if a site id was provided, save current blog and change to the other site */ if ( $site !== false ) { $current_blog = get_current_blog_id(); switch_to_blog( $site ); } + /* get all published posts */ $args = array ( 'post_type' => 'any', 'posts_per_page' => -1, 'post_status' => 'publish', ); - $posts = new WP_Query( $args ); + /* get all the posts, one by one */ while ( $posts->have_posts() ) { $posts->the_post(); + /* get the permalink for currently selected post */ switch ($post->post_type) { case 'revision': case 'nav_menu_item':@@ -864,12 +914,15 @@ $permalink = get_post_permalink( $post->ID );
break; } + /* collect permalinks */ $links[] = $permalink; } + /* just in case, reset $post */ wp_reset_postdata(); + /* switch back to original site if we navigated away */ if ( $site !== false ) { switch_to_blog( $current_blog ); }