From 20bb48be44282b5aac2ba3bf89b083c0b89ef076 Mon Sep 17 00:00:00 2001 From: cadeyrn Date: Mon, 6 Aug 2012 12:18:48 +0000 Subject: [PATCH] tagging version 0.4 git-svn-id: http://plugins.svn.wordpress.org/wp-ffpc/tags/0.4@582238 b8457f37-d9ea-0310-8a92-e5e31aec5664 --- advanced-cache.php | 268 +++++++++++++++++ css/wp-ffpc.admin.css | 53 ++++ nginx-sample.conf | 27 ++ readme.txt | 113 +++++++ wp-ffpc-common.php | 248 ++++++++++++++++ wp-ffpc.php | 668 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 1377 insertions(+) create mode 100644 advanced-cache.php create mode 100644 css/wp-ffpc.admin.css create mode 100644 nginx-sample.conf create mode 100644 readme.txt create mode 100644 wp-ffpc-common.php create mode 100644 wp-ffpc.php diff --git a/advanced-cache.php b/advanced-cache.php new file mode 100644 index 0000000..156d968 --- /dev/null +++ b/advanced-cache.php @@ -0,0 +1,268 @@ +$v) { + // test cookie makes to cache not work!!! + if ($n == 'wordpress_test_cookie') continue; + // wp 2.5 and wp 2.3 have different cookie prefix, skip cache if a post password cookie is present, also + if ( (substr($n, 0, 14) == 'wordpressuser_' || substr($n, 0, 10) == 'wordpress_' || substr($n, 0, 12) == 'wp-postpass_') && !$wp_ffpc_config['cache_loggedin'] ) { + return false; + } + } +} + +global $wp_ffpc_backend_status; +$wp_ffpc_backend_status = wp_ffpc_init( ); + +/* check alive status of backend */ +if ( !$wp_ffpc_backend_status ) + return false; + +/* use the full accessed URL string as key, same will be generated by nginx as well + we need a data and a meta key: data is string only with content, meta is not used in nginx */ +global $wp_ffpc_data_key; +$wp_ffpc_data_key = $wp_ffpc_config['prefix_data'] . $_SERVER['HTTP_HOST'] . $wp_ffpc_uri; +global $wp_ffpc_meta_key; +$wp_ffpc_meta_key = $wp_ffpc_config['prefix_meta'] . $_SERVER['HTTP_HOST'] . $wp_ffpc_uri; + +/* search for valid meta entry */ +global $wp_ffpc_meta; +$wp_ffpc_meta = wp_ffpc_get ( $wp_ffpc_meta_key ); + +/* meta is corrupted or empty */ +if ( !$wp_ffpc_meta ) { + wp_ffpc_start(); + return; +} + +/* search for valid data entry */ +global $wp_ffpc_data; +$uncompress = ( isset($wp_ffpc_meta['compressed']) ) ? $wp_ffpc_meta['compressed'] : false; +$wp_ffpc_data = wp_ffpc_get ( $wp_ffpc_data_key , $uncompress ); + +/* data is corrupted or empty */ +if ( !$wp_ffpc_data ) { + wp_ffpc_start(); + return; +} + +/* 404 status cache */ +if ($wp_ffpc_meta['status'] == 404) { + header("HTTP/1.1 404 Not Found"); + flush(); + die(); +} + +/* server redirect cache */ +if ($wp_ffpc_meta['redirect_location']) { + header('Location: ' . $wp_ffpc_meta['redirect_location']); + flush(); + die(); +} + +/* page is already cached on client side (chrome likes to do this, anyway, it's quite efficient) */ +if (array_key_exists("HTTP_IF_MODIFIED_SINCE", $_SERVER) && !empty($wp_ffpc_meta['lastmodified']) ) { + $if_modified_since = strtotime(preg_replace('/;.*$/', '', $_SERVER["HTTP_IF_MODIFIED_SINCE"])); + /* check is cache is still valid */ + if ( $if_modified_since >= $wp_ffpc_meta['lastmodified'] ) { + header("HTTP/1.0 304 Not Modified"); + flush(); + die(); + } +} + +/* data found & correct, serve it */ +header('Content-Type: ' . $wp_ffpc_meta['mime']); +/* don't allow browser caching of page */ +header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0'); +header('Pragma: no-cache'); +/* expire at this very moment */ +header('Expires: ' . gmdate("D, d M Y H:i:s", time() ) . " GMT"); + +/* if shortlinks were set */ +if (!empty ( $wp_ffpc_meta['shortlink'] ) ) + header('Link:<'. $wp_ffpc_meta['shortlink'] .'>; rel=shortlink'); + +/* if last modifications were set (for posts & pages) */ +if ( !empty($wp_ffpc_meta['lastmodified']) ) + header('Last-Modified: ' . gmdate("D, d M Y H:i:s", $wp_ffpc_meta['lastmodified'] ). " GMT"); + +/* only set when not multisite, fallback to HTTP HOST */ +$wp_ffpc_pingback_url = (empty( $wp_ffpc_config['url'] )) ? $_SERVER['HTTP_HOST'] : $wp_ffpc_config['url']; + +/* pingback additional header */ +if ($wp_ffpc_config['pingback_status']) + header('X-Pingback: ' . $wp_ffpc_pingback_url . '/xmlrpc.php' ); + +/* for debugging */ +if ($wp_ffpc_config['debug']) + header('X-Cache-Engine: WP-FFPC with ' . $wp_ffpc_config['cache_type']); + +/* HTML data */ +echo $wp_ffpc_data; +flush(); +die(); + +/** + * FUNCTIONS + */ + +/** + * starts caching + * + */ +function wp_ffpc_start( ) { + ob_start('wp_ffpc_callback'); +} + +/** + * write cache function, called when page generation ended + */ +function wp_ffpc_callback($buffer) { + global $wp_ffpc_config; + global $wp_ffpc_data; + global $wp_ffpc_meta; + global $wp_ffpc_redirect; + global $wp_ffpc_meta_key; + global $wp_ffpc_data_key; + + /* no is_home = error */ + if (!function_exists('is_home')) + return $buffer; + + /* no close tag = not HTML, don't cache */ + if (strpos($buffer, '') === false) + return $buffer; + + /* reset meta to solve conflicts */ + $wp_ffpc_meta = array(); + + /* WP is sending a redirect */ + if ($wp_ffpc_redirect) { + $wp_ffpc_meta['redirect_location'] = $wp_ffpc_redirect; + wp_ffpc_write(); + return $buffer; + } + + /* trim unneeded whitespace from beginning / ending of buffer */ + $buffer = trim($buffer); + + /* Can be a trackback or other things without a body. + We do not cache them, WP needs to get those calls. */ + if (strlen($buffer) == 0) + return ''; + + if ( is_home() ) + $wp_ffpc_meta['type'] = 'home'; + elseif (is_feed() ) + $wp_ffpc_meta['type'] = 'feed'; + elseif ( is_archive() ) + $wp_ffpc_meta['type'] = 'archive'; + elseif ( is_single() ) + $wp_ffpc_meta['type'] = 'single'; + else if ( is_page() ) + $wp_ffpc_meta['type'] = 'page'; + else + $wp_ffpc_meta['type'] = 'unknown'; + + /* check if caching is disabled for page type */ + $nocache_key = 'nocache_'. $wp_ffpc_meta['type']; + + if ( $wp_ffpc_config[$nocache_key] == 1 ) { + return $buffer; + } + + if ( is_404() ) + $wp_ffpc_meta['status'] = 404; + + /* feed is xml, all others forced to be HTML */ + if ( is_feed() ) + $wp_ffpc_meta['mime'] = 'text/xml;charset='; + else + $wp_ffpc_meta['mime'] = 'text/html;charset='; + + /* set mimetype */ + $wp_ffpc_meta['mime'] = $wp_ffpc_meta['mime'] . $wp_ffpc_config['charset']; + + /* get shortlink, if possible */ + if (function_exists('wp_get_shortlink')) + { + $shortlink = wp_get_shortlink( ); + if (!empty ( $shortlink ) ) + $wp_ffpc_meta['shortlink'] = $shortlink; + } + + /* try if post is available + if made with archieve, last listed post can make this go bad + */ + global $post; + if ( !empty($post) && ( $wp_ffpc_meta['type'] == 'single' || $wp_ffpc_meta['type'] == 'page' ) ) + { + /* get last modification data */ + if (!empty ( $post->post_modified_gmt ) ) + $wp_ffpc_meta['lastmodified'] = strtotime ( $post->post_modified_gmt ); + } + + /* APC compression */ + $compress = ( ($wp_ffpc_config['cache_type'] == 'apc') && $wp_ffpc_config['apc_compress'] ) ? true : false; + $wp_ffpc_meta['compressed'] = $compress; + + /* set meta */ + wp_ffpc_set ( $wp_ffpc_meta_key, $wp_ffpc_meta ); + + /* set data */ + $data = $buffer; + wp_ffpc_set ( $wp_ffpc_data_key, $data , $compress ); + + /* vital for nginx version */ + header("HTTP/1.1 200 OK"); + /* echoes HTML out */ + return $buffer; +} + +?> diff --git a/css/wp-ffpc.admin.css b/css/wp-ffpc.admin.css new file mode 100644 index 0000000..2ee1814 --- /dev/null +++ b/css/wp-ffpc.admin.css @@ -0,0 +1,53 @@ +dt { + margin-top: 2em; + font-weight:bold; +} + +dd { + +} +fieldset { + display:block; + margin:0 1% 0 1%; + clear:none; +} + +legend { + font-weight:bold; + padding:0; + margin:0; + font-size:130%; + padding-top:3em; +} + +.default { + display:block; + padding-left: 1em; + font-size:90%; + color:#666; +} + +.description { + display:block; +} + +.grid50 { + float:left; + display:block; + text-align:left; + margin:0 1% 0 1%; + width:48%; + overflow:auto; +} + +.clearcolumns { + clear:both; +} + +.error-msg { + color: #990000; +} + +.ok-msg { + color: #009900; +} diff --git a/nginx-sample.conf b/nginx-sample.conf new file mode 100644 index 0000000..4b7e92b --- /dev/null +++ b/nginx-sample.conf @@ -0,0 +1,27 @@ +http { + ... + server { + ... + + location / { + try_files $uri $uri/ @memcached; + } + + location @memcached { + default_type text/html; + + set $memcached_key DATAPREFIX$host$request_uri; + memcached_pass MEMCACHEDHOST:MEMCACHEDPORT; + error_page 404 = @rewrites; + } + + location @rewrites { + rewrite ^(.*)$ /index.php?q=$1 last; + } + + ... + } +} +... + + diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..bfe86a2 --- /dev/null +++ b/readme.txt @@ -0,0 +1,113 @@ +=== WP-FFPC === +Contributors: cadeyrn +Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=8LZ66LGFLMKJW&lc=HU&item_name=Peter%20Molnar%20photographer%2fdeveloper&item_number=petermolnar%2dpaypal%2ddonation¤cy_code=USD&bn=PP%2dDonationsBF%3acredit%2epng%3aNonHosted +Tags: cache, APC, memcached, full page cache +Requires at least: 3.0 +Tested up to: 3.4.1 +Stable tag: 0.4 + +Fast Full Page Cache, backend can be memcached or APC + +== Description == +WP-FFPC is a full page cache plugin for WordPress. It can use APC or a memcached server as backend. The naming stands for Fast Full Page Cache. + +PHP has two extension for communication with a memcached server, named Memcache and Memcached. The plugin can utilize both. + += Features: = +* exclude possibility of home, feeds, archieves, pages, singles +* use APC or memcached as backend +* 404 caching +* redirects caching +* Last Modified HTTP header compatibility with 304 responses +* shortlink HTTP header preservation +* pingback HTTP header preservation(1) +* fallback to no caching if any error or problem occurs +* Wordpress Network compatible(2) +* nginx compatible(3) +* (optional) syslog messages of sets-gets-flushes + +(1) pingback hostname will always be generated from the accessed domain, otherwise speed would get highly compromised + +(2) If used in WordPress Network, the configuration will only be available for network admins at the network admin panel, and will be system-wide and will be applied for every blog. + +(3) nginx compatility means that if used with PHP Memcache or PHP Memcached extension, the created memcached entries can be read and served directly from nginx, making the cache insanely fast. +If used with APC, this feature is not available (no APC module for nginx), although, naturally, the cache modul is functional and working, but it will be done by PHP instead of nginx. +Short nginx example configuration is generated on the plugin settings page if Memcache or Memcached is selected as cache type. +NOTE: some features ( like pingback link in HTTP header ) will not be available with this solution! ( yet ) + +Some parts were based on [Hyper Cache](http://wordpress.org/extend/plugins/hyper-cache "Hyper Cache") plugin by Satollo (info@satollo.net). + +== Installation == +1. Upload contents of `wp-ffpc.zip` to the `/wp-content/plugins/` directory +2. Enable WordPress cache by adding `define('WP_CACHE',true);` in wp-config.php +3. Activate the plugin through the `Plugins` menu in WordPress (please use network wide activation if used in a WordPress Network) +4. Fine tune the settings in `Settings` -> `wp-ffpc` menu in WordPress. For WordPress Network, please visit the Network Admin panel, the options will be available at WP-FFPC menu entry. + +== Frequently Asked Questions == + += Known bugs = + +1. '%3C' character on home page load +**Description**: When the page address is entered by hand, it gets redirected to `page.address/%3C`. +**Solution**: only occurs with memcached, the reason is yet unknown. The bug has emerged once for me as well, setting up everything and restarting the memcached server solved it. + +2. random-like characters instead of page +***SOLVED, description below is outdated*** +**Description**: when nginx is used with memcached, characters like `xœí}ksÛ8²èg»` shows up instead of the page. +**Solution**: this is the zlib compression of the page text. If PHP uses Memcached (with the 'd' at the ending), the compression cannot be turned off (it should, but it does not) and nginx is unable to read out the entries. +Please use only the Memcache extension. You also need to select it on the settings site, this is because some hosts may provide both PHP extensions. + + += How to install memcache PHP extension? = +You need to have PECL on your machine. If it's ready, type `pecl install memcache` as root. +Some additional libraries can also be needed, but that varies by linux distributions. + += How to use the plugin on Amazon Linux? = +You have to remove the default yum package, named `php-pecl-memcache` and install `Memcache` with PECL. + +== Changelog == + += 0.4 = +2012.08.06 +* tested against new WordPress versions +* added lines to "memcached" storage to be able to work with nginx as well +* added lines to "memcached" to use binary protocol ( tested with PHP Memcached version 2.0.1 ) + +KNOWN ISSUES +* "memcache" extension fails in binary mode; the reason is under investigation + += 0.3.2 = +2012.02.27 + +* apc_cache_info replaced with apc_sma_info, makes plugin faster + += 0.3 = +2012.02.21 + +* added syslog debug messages possibility +* bugfix: removed (accidently used) short_open_tags + += 0.2.3 = +2012.02.21 + +* nginx-sample.conf file added, nginx config is created from here + += 0.2.2 = +2012.02.21 + +* memcache types bugfix, reported in forum, thanks! + += 0.2.1 = +2012.02.21 + +* bugfix, duplicated inclusion could emerge, fix added, thanks for Géza Kuti for reporting! + += 0.2 = +2012.02.19 + +* added APC compression option ( requires PHP ZLIB ). Useful is output pages are large. Compression is on lowest level, therefore size/CPU load is more or less optimal. + += 0.1 = +2012.02.16 + +* first public release diff --git a/wp-ffpc-common.php b/wp-ffpc-common.php new file mode 100644 index 0000000..a1faaae --- /dev/null +++ b/wp-ffpc-common.php @@ -0,0 +1,248 @@ +addServer( $wp_ffpc_config['host'] , $wp_ffpc_config['port'] ); + } + $wp_ffpc_backend_status = $wp_ffpc_backend->getServerStatus( $wp_ffpc_config['host'] , $wp_ffpc_config['port'] ); + break; + + /* in case of Memcached */ + case 'memcached': + /* Memcached class does not exist, Memcached extension is not available */ + if (!class_exists('Memcached')) + return false; + if ( $wp_ffpc_backend == NULL ) + { + $wp_ffpc_backend = new Memcached(); + $wp_ffpc_backend->setOption( Memcached::OPT_COMPRESSION , false ); + $wp_ffpc_backend->setOption( Memcached::OPT_BINARY_PROTOCOL , true ); + $wp_ffpc_backend->addServer( $wp_ffpc_config['host'] , $wp_ffpc_config['port'] ); + } + $wp_ffpc_backend_status = array_key_exists( $wp_ffpc_config['host'] . ':' . $wp_ffpc_config['port'] , $wp_ffpc_backend->getStats() ); + break; + + /* cache type is invalid */ + default: + return false; + } + return $wp_ffpc_backend_status; +} + +/** + * clear cache element or flush cache + * + * @param $post_id [optional] : if registered with invalidation hook, post_id will be passed + */ +function wp_ffpc_clear ( $post_id = false ) { + global $wp_ffpc_config; + global $post; + + $post_only = ( $post_id === 'system_flush' ) ? false : $wp_ffpc_config['invalidation_method']; + + /* post invalidation enabled */ + if ( $post_only ) + { + $path = substr ( get_permalink($post_id) , 7 ); + if (empty($path)) + return false; + $meta = $wp_ffpc_config['prefix-meta'] . $path; + $data = $wp_ffpc_config['prefix-data'] . $path; + } + + switch ($wp_ffpc_config['cache_type']) + { + /* in case of apc */ + case 'apc': + if ( $post_only ) + { + apc_delete ( $meta ); + wp_ffpc_log ( ' clearing key: "'. $meta . '"' ); + apc_delete ( $data ); + wp_ffpc_log ( ' clearing key: "'. $data . '"' ); + } + else + { + apc_clear_cache('user'); + wp_ffpc_log ( ' flushing user cache' ); + apc_clear_cache('system'); + wp_ffpc_log ( ' flushing system cache' ); + } + break; + + /* in case of Memcache */ + case 'memcache': + case 'memcached': + global $wp_ffpc_backend; + if ( $post_only ) + { + $wp_ffpc_backend->delete( $meta ); + wp_ffpc_log ( ' clearing key: "'. $meta . '"' ); + $wp_ffpc_backend->delete( $data ); + wp_ffpc_log ( ' clearing key: "'. $data . '"' ); + } + else + { + $wp_ffpc_backend->flush(); + wp_ffpc_log ( ' flushing cache' ); + } + break; + + /* cache type is invalid */ + default: + return false; + } + return true; +} + +/** + * sets a key-value pair in backend + * + * @param &$key store key, passed by reference for speed + * @param &$data store value, passed by reference for speed + * + */ +function wp_ffpc_set ( &$key, &$data, $compress = false ) { + global $wp_ffpc_config; + global $wp_ffpc_backend; + + $exp = $wp_ffpc_config['user_logged_in'] ? $wp_ffpc_config['expire_member'] : $wp_ffpc_config['expire_visitor']; + + /* syslog */ + if ($wp_ffpc_config['syslog']) + { + if ( @is_array( $data ) ) + $string = serialize($data); + elseif ( @is_string( $data )) + $string = $data; + + $size = strlen($string); + wp_ffpc_log ( ' set key: "'. $key . '", size: '. $size . ' byte(s)' ); + } + + switch ($wp_ffpc_config['cache_type']) + { + case 'apc': + /* use apc_store to overwrite data is existed */ + if ( $compress ) + $data = gzdeflate ( $data , 1 ); + return apc_store( $key , $data , $exp ); + break; + case 'memcache': + if ( $wp_ffpc_backend != NULL ) + /* false to disable compression, vital for nginx */ + $wp_ffpc_backend->set ( $key, $data , false, $exp ); + else + return false; + break; + case 'memcached': + if ( $wp_ffpc_backend != NULL ) + $wp_ffpc_backend->set ( $key, $data , $exp ); + else + return false; + break; + } +} + +/** + * gets cached element by key + * + * @param &$key: key of needed cache element + * + */ +function wp_ffpc_get( &$key , $uncompress = false ) { + global $wp_ffpc_config; + global $wp_ffpc_backend; + + /* syslog */ + wp_ffpc_log ( ' get key: "'.$key . '"' ); + + switch ($wp_ffpc_config['cache_type']) + { + case 'apc': + $value = apc_fetch($key); + if ( $uncompress ) + $value = gzinflate ( $value ); + return $value; + case 'memcache': + case 'memcached': + if ( $wp_ffpc_backend != NULL ) + return $wp_ffpc_backend->get($key); + else + return false; + default: + return false; + } +} + + +/** + * handles log messages + * + * @param $string log messagr + */ +function wp_ffpc_log ( $string ) { + global $wp_ffpc_config; + + /* syslog */ + if ($wp_ffpc_config['syslog'] && function_exists('syslog') ) + syslog( WP_FFPC_LOG_LEVEL , WP_FFPC_PARAM . $string . WP_FFPC_LOG_TYPE_MSG ); + +} +?> diff --git a/wp-ffpc.php b/wp-ffpc.php new file mode 100644 index 0000000..d589e24 --- /dev/null +++ b/wp-ffpc.php @@ -0,0 +1,668 @@ +get_options(); + + /* check is backend is available */ + $alive = wp_ffpc_init( $this->options ); + + /* don't register hooks if backend is dead */ + if ($alive) + { + /* init inactivation hooks */ + add_action('switch_theme', array( $this , 'invalidate'), 0); + add_action('edit_post', array( $this , 'invalidate'), 0); + add_action('publish_post', array( $this , 'invalidate'), 0); + add_action('delete_post', array( $this , 'invalidate'), 0); + + /* Capture and register if a redirect is sent back from WP, so the cache + can cache (or ignore) it. Redirects were source of problems for blogs + with more than one host name (eg. domain.com and www.domain.com) comined + with the use of Hyper Cache.*/ + add_filter('redirect_canonical', array( $this , 'redirect_canonical') , 10, 2); + } + + /* add admin styling */ + if( is_admin() ) + { + wp_enqueue_style( WP_FFPC_PARAM . '.admin.css' , WP_FFPC_URL . '/css/'. WP_FFPC_PARAM .'.admin.css', false, '0.1'); + } + + /* on activation */ + register_activation_hook(__FILE__ , array( $this , 'activate') ); + + /* on deactivation */ + register_deactivation_hook(__FILE__ , array( $this , 'deactivate') ); + + /* on uninstall */ + register_uninstall_hook(__FILE__ , array( $this , 'uninstall') ); + + /* init plugin in the admin section */ + /* if multisite, admin page will be on network admin section */ + if ( MULTISITE ) + add_action('network_admin_menu', array( $this , 'admin_init') ); + /* not network, will be in simple admin menu */ + else + add_action('admin_menu', array( $this , 'admin_init') ); + } + + /** + * activation hook: save default settings in order to eliminate bugs. + * + */ + function activate ( ) { + $this->save_settings( true ); + } + + /** + * init function for admin section + * + */ + function admin_init () { + /* register options */ + add_site_option( WP_FFPC_PARAM, $this->options , '' , 'no'); + + /* save parameter updates, if there are any */ + if ( isset($_POST[WP_FFPC_PARAM . '-save']) ) + { + $this->save_settings (); + $this->status = 1; + header("Location: admin.php?page=" . WP_FFPC_OPTIONS_PAGE . "&saved=true"); + } + + add_menu_page('Edit WP-FFPC options', __('WP-FFPC', WP_FFPC_PARAM ), 10, WP_FFPC_OPTIONS_PAGE , array ( $this , 'admin_panel' ) ); + } + + /** + * settings panel at admin section + * + */ + function admin_panel ( ) { + + /** + * security + */ + if( ! function_exists( 'current_user_can' ) || ! current_user_can( 'manage_options' ) ){ + die( ); + } + + /** + * if options were saved + */ + if ($_GET['saved']=='true' || $this->status == 1) : ?> +

Settings saved.

+ + +

WARNING: WP_CACHE is disabled, plugin will not work that way. Please add define( 'WP_CACHE', true ); into the beginning of wp-config.php

+ + +
+

+
+ +
+ +
+
+ +
+ +
+
+ + + : cache_type( $this->defaults['cache_type'] , true ) ; ?> +
+ +
+ +
+
+ + + : defaults['expire']; ?> +
+ +
+ +
+
+ + + : defaults['charset']; ?> +
+ +
+ +
+
+ + WARNING! When selection "all", the cache will be fully flushed, including elements that were set by other applications.

', WP_FFPC_PARAM); ?>
+ : invalidation_method( $this->defaults['invalidation_method'] , true ) ; ?> +
+ +
+ +
+
+ + + : defaults['prefix_data']; ?> +
+ +
+ +
+
+ + + : defaults['prefix_meta']; ?> +
+ +
+ +
+
+ options['debug'],true); ?> /> + + : print_bool( $this->defaults['debug']); ?> +
+ +
+ +
+
+ options['syslog'],true); ?> /> + + : print_bool( $this->defaults['syslog']); ?> +
+ +
+ +
+
+ options['pingback_status'],true); ?> /> + + : print_bool( $this->defaults['pingback_status']); ?> +
+ +
+ +
+
+ +
+
+ options['cache_loggedin'],true); ?> /> + + : print_bool( $this->defaults['cache_loggedin']); ?> +
+ +
+ +
+
+ options['nocache_home'],true); ?> /> + + : print_bool( $this->defaults['nocache_home']); ?> +
+ +
+ +
+
+ options['nocache_feed'],true); ?> /> + + : print_bool( $this->defaults['nocache_feed']); ?> +
+ +
+ +
+
+ options['nocache_archive'],true); ?> /> + + : print_bool( $this->defaults['nocache_archive']); ?> +
+ +
+ +
+
+ options['nocache_single'],true); ?> /> + + : print_bool( $this->defaults['nocache_single']); ?> +
+ +
+ +
+
+ options['nocache_page'],true); ?> /> + + : print_bool( $this->defaults['nocache_page']); ?> +
+
+
+
+ +
+ + + +

No PHP memcached extension was found. To use memcached, you need PHP Memcache or PHP Memcached extension.

+ + + options['cache_type'] == 'memcached' || $this->options['cache_type'] == 'memcache' ) : ?> +
+ + options); + + $server_status = ( empty($server_status) || $server_status == 0 ) ? 'down' : 'up & running' ; + echo $server_status; + ?> + +
+ + +
+ +
+ +
+
+ + + : defaults['host']; ?> +
+ +
+ +
+
+ + + : defaults['port']; ?> +
+ +
+
+ + options['cache_type'] == 'memcache' || $this->options['cache_type'] == 'memcached' ) : ?> + +
+ + options['prefix_data'], $this->options['host'], $this->options['port'] ); + $nginx = file_get_contents ( WP_FFPC_DIR .'/nginx-sample.conf' ); + $nginx = str_replace ( $search , $replace , $nginx ); + + ?> +
+
+ + + +
+ +
+ +
+ +
+
+ options['apc_compress'],true); ?> /> + + : print_bool( $this->defaults['apc_compress']); ?> +
+ +
+
+ +

+
+ input field with $current set as active + * + */ + function cache_type ( $current , $returntext = false ) { + + $e = array ( + 'apc' => 'use APC as store', + 'memcache' => 'use memcached server with Memcache extension', + 'memcached' => 'use memcached server with Memcached extension', + ); + + $this->print_select_options ( $e , $current , $returntext ); + + } + + /** + * deactivation hook: clear advanced-cache config file + * + */ + function deactivate ( ) { + if (@file_exists (WP_FFPC_ACACHE_MAIN_FILE)) + @unlink (WP_FFPC_ACACHE_MAIN_FILE); + } + + /** + * invalidate cache + */ + function invalidate ( $post_id ) { + wp_ffpc_clear ( $post_id ); + } + + /** + * generates invalidation method select box + * + * @param $current + * the active or required size's identifier + * + * @param $returntext + * boolean: is true, the description will be returned of $current size + * + * @return + * prints either description of $current + * or option list for a input field with $current set as active + * + */ + function print_select_options ( $sizes, $current, $returntext=false ) { + + if ( $returntext ) + { + _e( $sizes[ $current ] , WP_FFPC_PARAM); + return; + } + + foreach ($sizes as $ext=>$name) + { + ?> + + options as $name=>$optionvalue) + { + if (!empty($_POST[$name])) + { + $update = $_POST[$name]; + if (strlen($update)!=0 && !is_numeric($update)) + $update = stripslashes($update); + } + elseif ( ( empty($_POST[$name]) && is_bool ($this->defaults[$name]) ) || is_numeric( $update ) ) + { + $update = 0; + } + else + { + $update = $this->defaults[$name]; + } + $this->options[$name] = $update; + } + + update_site_option( WP_FFPC_PARAM , $this->options ); + + $this->invalidate('system_flush'); + + if ( ! $firstrun ) + $this->generate_config(); + + } + + /** + * clean up at uninstall + * + */ + function uninstall ( ) { + delete_site_option( WP_FFPC_PARAM ); + } + + } +} + +/** + * instantiate the class + */ +$wp_nmc = new WPFFPC(); + + +?>