trunk replaced with branch v1.0; merge was impossible

git-svn-id: http://plugins.svn.wordpress.org/wp-ffpc/trunk@684132 b8457f37-d9ea-0310-8a92-e5e31aec5664
This commit is contained in:
cadeyrn 2013-03-19 10:16:20 +00:00
parent 6f1de84c59
commit f845f9f22b
2 changed files with 122 additions and 971 deletions

View file

@ -1,49 +1,35 @@
=== WP-FFPC ===
Contributors: cadeyrn
Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=XU3DG7LLA76WC
Tags: cache, APC, memcache, memcached, page cache, full page cache, nginx
Tags: cache, memcached, full page cache, NGiNX, memcache, page cache
Requires at least: 3.0
Tested up to: 3.5.1
Stable tag: 0.6.1
Stable tag: 1.0
License: GPLv3
License URI: http://www.gnu.org/licenses/gpl-3.0.html
Store WordPress pages in memcached and serve them with nginx - unbeatable speed!
Cache WordPress to memcached and serve them with NGiNX - unbeatable speed!
== Description ==
WP-FFPC is a full page cache plugin for WordPress. Supports memcached server or APC as backend and both widely available PHP memcached modules, Memcache and Memcached as well.
= Support & Info =
I provide support for the plugin as best as I can, but it comes without guarantee.
Please post feature requests to [WP-FFPC feature request topic](http://wordpress.org/support/topic/feature-requests-14 "WP-FFPC feature request topic").
= Notice for versions before 0.6.1 =
**from version 0.6.1 a lot of things have changed, including true multisite support ( possible per site different settings in a network ), rewritten memcached backend, etc. Please delete the previous settings by using the "delete options" button on the bottom right of the settings page after upgrading from previous versions.**
WP-FFPC ( WordPress Fast Full Page Cache ) is a cache plugin for [WordPress](http://wordpress.org/ "WordPress").
Supports PHP Memcached, PHP Memcache and APC as storage engines.
= Features: =
* exclude possibilities: of home, feeds, archieves, pages, singles
* possibility to enable caching for logged-in users
* APC or memcached server storage
* [NGiNX](http://NGiNX.org "NGiNX") compatibility
* full Wordpress Network support
* cache exclude possibilities ( home, feeds, archieves, pages, singles )
* (optional) cache for logged-in users
* 404 caching
* redirects caching
* Last Modified HTTP header compatibility with 304 responses
* canonical redirects caching
* Last Modified HTTP header support ( for 304 responses )
* shortlink HTTP header preservation
* pingback HTTP header preservation(1)
* fallback to no caching if any error or problem occurs
* syslog & debug settings for troubleshooting
* supports multiple memcached backends
* Wordpress Network compatible (2)
* nginx compatible(3)
* pingback HTTP header preservation
* (optional) talkative log for troubleshooting
* multiple memcached upstream support
(1) pingback hostname will always be generated from the accessed domain, otherwise speed would get highly compromised
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").
(2) Plugin is capable of either Network wide or per site settings, meaning if not network-wide enabled, settings could vary from site to site, plugin could be turned off and on without interfering other sites.
**Only for subdomain ( or different domain) setup**, subdirectory setup is not yet supported!
(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.
If used with APC, this feature is not available (no APC module for nginx).
Short nginx example configuration is generated on the plugin settings page, under `nginx` tab according to the settings of the plugin.
NOTE: some features ( most of additional HTTP headers for example, like pingback, shortlink, etc. ) will not be available with this solution! ( yet )
Parts are based on [Hyper Cache](http://wordpress.org/extend/plugins/hyper-cache "Hyper Cache") plugin by Satollo (info@satollo.net).
Thanks for [Hyper Cache](http://wordpress.org/extend/plugins/hyper-cache "Hyper Cache") for beeing inspirational.
== Installation ==
@ -55,13 +41,32 @@ Parts are based on [Hyper Cache](http://wordpress.org/extend/plugins/hyper-cache
== Frequently Asked Questions ==
= How to install memcache PHP extension? =
On most of the distributions, php5-memcached or php5-memcache is available as package.
You can use PECL alternatively: `pecl install memcached`.
It's recommended to use Memcached instead of Memcache.
= How to use the plugin on Amazon Linux? =
You have to remove the default yum package, named `php-pecl-memcache` and install `Memcache` or `Memcached` through PECL.
You have to remove the default yum package, named `php-pecl-memcache` and install `Memcached` through PECL.
= Information: network wide settings always overwrite site settings =
Since the plugin can be used as per-site configured in a network, if the plugin get network active later, the network settings will always overwrite the per site configuration.
= Information: Log levels =
Log levels ( if logging enabled ) includes info, warning and error level messages; error level most usually means PHP configuration error or missing plugin configuration.
= Information: Using it with NGiNX =
If the storage engine is either PHP Memcache or PHP Memcached extension, the created entries can be read and served directly from NGiNX ( if it has memcache or memc extension )
A short configuration example is generated on the plugin settings page, under `NGiNX` tab according to the saved settings.
**NOTE** Some features ( most of additional HTTP headers for example, like pingback, shortlink, etc. ) will not be available with this solution.
= Information: Support & Info =
I provide support for the plugin as best as I can, but it comes without guarantee.
Please post feature requests to [WP-FFPC feature request topic](http://wordpress.org/support/topic/feature-requests-14 "WP-FFPC feature request topic").
= PLugin requirements =
* WordPress >= 3.0
and **at least one** of the following for storage backend:
* PHP APC
* PHP Memcached > 0.1.0
* PHP Memcache > 2.1.0
== Screenshots ==
@ -70,10 +75,32 @@ You have to remove the default yum package, named `php-pecl-memcache` and instal
3. cache exceptions
4. apc settings
5. memcached servers settings
6. nginx example
6. NGiNX example
== Changelog ==
= 1.0 =
*in RC state*
* Software licence change from GPLv2 to GPLv3
* backend code completely replaced ( object-based backend, improved readability & better structure, lot less global vars, etc. )
* revisited multisite support ( solved overwriting-problems )
* preparations for localization support ( all strings are now go through WordPress translate except for advanced-cache logging, since there's no WordPress available at that point )
* more and more detailed log & error messages
* retouched Memcache initialization ( faster connect )
**Bugfixes**
* reported bug of faulty expiration times fixed
* eliminated warning message for memcache when no memcache extension is present
* fixed multisite settings overwriting issue
**Dropped functions**
* APC entry compression support
**Planned features for next major release**
* support for Redis backend
* optional NGiNX header preservation for shortlink, pingback and last-modified headers
= 0.6.1 =
*2013.03.08*
@ -135,7 +162,7 @@ There are major problems with the "memcache" driver, the source is yet unkown. T
*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" 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**
@ -156,7 +183,7 @@ There are major problems with the "memcache" driver, the source is yet unkown. T
= 0.2.3 =
*2012.02.21*
* nginx-sample.conf file added, nginx config is created from here
* NGiNX-sample.conf file added, NGiNX config is created from here
= 0.2.2 =
*2012.02.21*

View file

@ -1,18 +1,18 @@
<?php
/*
Plugin Name: WP-FFPC
Version: 0.6.1
Plugin URI: http://petermolnar.eu/wordpress/wp-ffpc
Description: Fast Full Page Cache, backend can be memcached or APC
Author: Peter Molnar
Description: WordPress cache plugin for memcached & nginx - unbeatable speed
Version: 1.0
Author: Peter Molnar <hello@petermolnar.eu>
Author URI: http://petermolnar.eu/
License: GPL2
License: GPLv3
*/
/* Copyright 2010-2013 Peter Molnar (email : hello@petermolnar.eu )
/* Copyright 2010-2013 Peter Molnar ( hello@petermolnar.eu )
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License, version 2, as
it under the terms of the GNU General Public License, version 3, as
published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
@ -23,682 +23,19 @@ License: GPL2
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
* checks for SSL connection
*/
if ( ! function_exists ( 'replace_if_ssl' ) ) {
function replace_if_ssl ( $string ) {
if ( isset($_SERVER['HTTPS']) && ( ( strtolower($_SERVER['HTTPS']) == 'on' ) || ( $_SERVER['HTTPS'] == '1' ) ) )
return str_replace ( 'http://' , 'https://' , $string );
else
return $string;
}
}
include_once ( 'wp-ffpc-class.php' );
/* fix */
if ( ! defined( 'WP_PLUGIN_URL_' ) )
{
if ( defined( 'WP_PLUGIN_URL' ) )
define( 'WP_PLUGIN_URL_' , replace_if_ssl ( WP_PLUGIN_URL ) );
else
define( 'WP_PLUGIN_URL_', replace_if_ssl ( get_option( 'siteurl' ) ) . '/wp-content/plugins' );
}
if ( ! defined( 'WP_PLUGIN_DIR' ) )
define( 'WP_PLUGIN_DIR', ABSPATH . 'wp-content/plugins' );
/* constants */
define ( 'WP_FFPC_PARAM' , 'wp-ffpc' );
define ( 'WP_FFPC_OPTION_GROUP' , 'wp-ffpcparams' );
define ( 'WP_FFPC_OPTIONS_PAGE' , 'wp-ffpcoptions' );
define ( 'WP_FFPC_URL' , WP_PLUGIN_URL_ . '/' . WP_FFPC_PARAM );
define ( 'WP_FFPC_DIR' , WP_PLUGIN_DIR . '/' . WP_FFPC_PARAM );
define ( 'WP_FFPC_CONF_DIR' , WP_PLUGIN_DIR . '/' . WP_FFPC_PARAM .'/config' );
define ( 'WP_FFPC_ACACHE_MAIN_FILE' , ABSPATH . 'wp-content/advanced-cache.php' );
define ( 'WP_FFPC_ACACHE_INC_FILE' , WP_FFPC_DIR. '/advanced-cache.php' );
define ( 'WP_FFPC_ACACHE_COMMON_FILE' , WP_FFPC_DIR. '/wp-ffpc-common.php' );
define ( 'WP_FFPC_CONFIG_VAR' , '$wp_ffpc_config' );
define ( 'WP_FFPC_SERVER_LIST_SEPARATOR' , ',' );
define ( 'WP_FFPC_SERVER_SEPARATOR', ':' );
define ( 'WP_FFPC_DONATION_LINK', 'https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=XU3DG7LLA76WC' );
define ( 'WP_FFPC_FILE' , plugin_basename(__FILE__) );
define ( 'WP_FFPC_PLUGIN' , 'wp-ffpc/wp-ffpc.php' );
define ( 'WP_FFPC_VERSION' , '0.6.1' );
if ( ! function_exists( 'is_plugin_active_for_network' ) )
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
/* get the common functions */
include_once (WP_FFPC_DIR .'/wp-ffpc-common.php');
if (!class_exists('WPFFPC')) {
/**
* main class
*
*/
class WPFFPC {
/* for options array */
var $options = array();
/* stores options for all sites & all data */
var $all_options = array();
/* key for current options array */
var $options_key = '';
/* for default options array */
var $defaults = array();
/* memcached server object */
var $memcached = NULL;
var $memcached_string = '';
/* status, 0 = nothing happened*/
var $status = 0;
/* stores information if plugin is network active or not */
var $network = false;
var $settingslink = '';
/**
* constructor
*
*/
function __construct() {
/* set settings page link */
$this->settingslink = 'options-general.php?page=' . WP_FFPC_OPTIONS_PAGE;
/* check if plugin is network-activated */
$this->check_for_network();
/* register options */
$this->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);
}
$plugin = plugin_basename( __FILE__ );
if ( $this->network )
add_filter( "network_admin_plugin_action_links_$plugin", array( $this, 'settings_link' ) );
else
add_filter( "plugin_action_links_$plugin", array( $this, 'settings_link' ) );
/* add admin styling */
if( is_admin() )
{
wp_enqueue_script ( "jquery-ui-tabs" );
wp_enqueue_style( WP_FFPC_PARAM . '.admin.css' , WP_FFPC_URL . '/' . 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 ( $this->network )
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') );
if ( $this->all_options['version'] < WP_FFPC_VERSION ) {
$this->save_settings ();
if ( @file_exists( WP_FFPC_ACACHE_MAIN_FILE )) {
$this->generate_config();
}
}
}
/**
* activation hook: save default settings in order to eliminate bugs.
*
*/
function activate ( ) {
/* register options for first time */
add_site_option( WP_FFPC_PARAM, $this->options , '' , 'yes');
$this->save_settings( true );
}
/**
* init function for admin section
*
*/
function admin_init () {
/* save parameter updates, if there are any */
if ( isset($_POST[WP_FFPC_PARAM . '-save']) )
{
$this->save_settings ();
$this->status = 1;
header( "Location: ". $this->settingslink ."&saved=true" );
}
/* save parameter updates, if there are any */
if ( isset($_POST[WP_FFPC_PARAM . '-delete']) )
{
$this->delete_options();
$this->status = 2;
header( "Location: ". $this->settingslink ."&deleted=true" );
}
if ( $this->network )
$optionspage = 'settings.php';
else
$optionspage = 'options-general.php';
/* we use settings menu, no need for highest level menu */
add_submenu_page( $optionspage, '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) : ?>
<div id='setting-error-settings_updated' class='updated settings-error'><p><strong>Settings saved.</strong></p></div>
<?php endif;
/**
* if options were saved
*/
if ($_GET['deleted']=='true' || $this->status == 2) : ?>
<div id='setting-error-options_deleted' class='error'><p><strong>Plugin options deleted.</strong></p></div>
<?php endif;
/**
* the admin panel itself
*/
?>
<script>
jQuery(document).ready(function($) {
jQuery( "#wp-ffpc-settings" ).tabs();
});
</script>
<div class="wrap">
<h4>This plugin helped your business? <a href="<?php echo WP_FFPC_DONATION_LINK; ?>">Buy me a coffee for having it, please :)</a></h4>
<?php if ( !WP_CACHE ) : ?>
<div class="error"><p><strong><?php _e("WARNING: WP_CACHE is disabled, plugin will not work that way. Please add define( 'WP_CACHE', true ); into the beginning of wp-config.php", WP_FFPC_PARAM); ?></strong></p></div>
<?php endif; ?>
<?php if ( ! file_exists ( WP_FFPC_ACACHE_MAIN_FILE ) ): ?>
<div class="error"><p><strong><?php _e("WARNING: advanced cache file is yet to be generated, please save settings!", WP_FFPC_PARAM); ?></strong></p></div>
<?php endif; ?>
<?php if ( $this->options['cache_type'] == 'memcached' && !class_exists('Memcached') ) : ?>
<div class="error"><p><strong><?php _e('ERROR: Memcached cache backend activated but no PHP memcached extension was found.', WP_FFPC_PARAM); ?></strong></p></div>
<?php endif; ?>
<?php if ( $this->options['cache_type'] == 'memcache' && !class_exists('Memcache') ) : ?>
<div class="error"><p><strong><?php _e('ERROR: Memcache cache backend activated but no PHP memcache extension was found.', WP_FFPC_PARAM); ?></strong></p></div>
<?php endif; ?>
<?php
/* get the current runtime configuration for memcache in PHP */
$memcached_settings = ini_get_all( 'memcache' );
$memcached_protocol = strtolower($memcached_settings['memcache.protocol']['local_value']);
?>
<?php if ( $this->options['cache_type'] == 'memcache' && $memcached_protocol == 'binary' ) : ?>
<div class="error"><p><strong><?php _e('WARNING: Memcache extension is configured to use binary mode. This is very buggy and the plugin will most probably not work. Please consider to change either to ascii mode or to Mecached extension.', WP_FFPC_PARAM); ?></strong></p></div>
<?php endif; ?>
<?php if ( $this->options['cache_type'] == 'memcached' || $this->options['cache_type'] == 'memcache' ) : ?>
<div class="updated">
<p><strong>
<?php
_e ( 'Driver: ' , WP_FFPC_PARAM);
echo $this->options['cache_type'];
?>
</strong></p>
<p>
<?php
_e( '<strong>Backend status:</strong><br />', WP_FFPC_PARAM );
$init = wp_ffpc_init( $this->options );
/* we need to go through all servers */
foreach ( $this->options['servers'] as $server_string => $server ) {
echo $server['host'] . ":" . $server['port'] ." => ";
if ( is_array($init) && $init[$server_string] === false )
_e ( '<span class="error-msg">down</span><br />', WP_FFPC_PARAM );
elseif ( is_array($init) && $init[$server_string] === true )
_e ( '<span class="ok-msg">up & running</span><br />', WP_FFPC_PARAM );
else
_e ( '<span class="error-msg">unknown, please try re-saving settings!</span><br />', WP_FFPC_PARAM );
}
?>
</p>
</div>
<?php endif; ?>
<h2><?php _e( 'WP-FFPC settings', WP_FFPC_PARAM ) ; ?></h2>
<form method="post" action="#" id="wp-ffpc-settings" class="wp-ffpc-panel">
<ul class="tabs">
<li><a href="#wp-ffpc-type" class="wp-switch-editor"><?php _e( 'Cache type', WP_FFPC_PARAM ); ?></a></li>
<li><a href="#wp-ffpc-debug" class="wp-switch-editor"><?php _e( 'Debug & in-depth', WP_FFPC_PARAM ); ?></a></li>
<li><a href="#wp-ffpc-exceptions" class="wp-switch-editor"><?php _e( 'Cache exceptions', WP_FFPC_PARAM ); ?></a></li>
<li><a href="#wp-ffpc-apc" class="wp-switch-editor"><?php _e( 'APC', WP_FFPC_PARAM ); ?></a></li>
<li><a href="#wp-ffpc-memcached" class="wp-switch-editor"><?php _e( 'Memcache(d)', WP_FFPC_PARAM ); ?></a></li>
<li><a href="#wp-ffpc-nginx" class="wp-switch-editor"><?php _e( 'nginx', WP_FFPC_PARAM ); ?></a></li>
</ul>
<fieldset id="wp-ffpc-type">
<legend><?php _e( 'Set cache type', WP_FFPC_PARAM ); ?></legend>
<dl>
<dt>
<label for="cache_type"><?php _e('Select backend', WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<select name="cache_type" id="cache_type">
<?php $this->cache_type ( $this->options['cache_type'] ) ?>
</select>
<span class="description"><?php _e('Select cache driver: ', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php $this->cache_type( $this->defaults['cache_type'] , true ) ; ?></span>
</dd>
<dt>
<label for="expire"><?php _e('Entry invalidation time', WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<input type="number" name="expire" id="expire" value="<?php echo $this->options['expire']; ?>" />
<span class="description"><?php _e('How long will an entry be valid', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php echo $this->defaults['expire']; ?></span>
</dd>
<dt>
<label for="charset"><?php _e('Charset to send data with.', WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<input type="text" name="charset" id="charset" value="<?php echo $this->options['charset']; ?>" />
<span class="description"><?php _e('Charset of HTML and XML (pages and feeds) data.', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php echo $this->defaults['charset']; ?></span>
</dd>
<dt>
<label for="invalidation_method"><?php _e('Cache invalidation method', WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<select name="invalidation_method" id="invalidation_method">
<?php $this->invalidation_method ( $this->options['invalidation_method'] ) ?>
</select>
<span class="description"><?php _e('Select cache invalidation method. <p><strong>WARNING! When selection "all", the cache will be fully flushed, including elements that were set by other applications.</strong></p>', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php $this->invalidation_method( $this->defaults['invalidation_method'] , true ) ; ?></span>
</dd>
<dt>
<label for="prefix_data"><?php _e('Data prefix', WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<input type="text" name="prefix_data" id="prefix_data" value="<?php echo $this->options['prefix_data']; ?>" />
<span class="description"><?php _e('Prefix for HTML content keys, can be used in nginx.', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php echo $this->defaults['prefix_data']; ?></span>
</dd>
<dt>
<label for="prefix_meta"><?php _e('Meta prefix', WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<input type="text" name="prefix_meta" id="prefix_meta" value="<?php echo $this->options['prefix_meta']; ?>" />
<span class="description"><?php _e('Prefix for meta content keys, used only with PHP processing.', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php echo $this->defaults['prefix_meta']; ?></span>
</dd>
</dl>
</fieldset>
<fieldset id="wp-ffpc-debug">
<legend><?php _e( 'Debug & in-depth settings', WP_FFPC_PARAM ); ?></legend>
<dl>
<dt>
<label for="debug"><?php _e("Enable debug mode", WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<input type="checkbox" name="debug" id="debug" value="1" <?php checked($this->options['debug'],true); ?> />
<span class="description"><?php _e('An additional header, "X-Cache-Engine" will be added when pages are served through WP-FFPC.', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php $this->print_bool( $this->defaults['debug']); ?></span>
</dd>
<dt>
<label for="syslog"><?php _e("Enable syslog messages", WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<input type="checkbox" name="syslog" id="syslog" value="1" <?php checked($this->options['syslog'],true); ?> />
<span class="description"><?php _e('Writes sets, gets and flushes at INFO level into syslog, using "syslog" function of PHP.', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php $this->print_bool( $this->defaults['syslog']); ?></span>
</dd>
<dt>
<label for="pingback_status"><?php _e("Enable pingback links", WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<input type="checkbox" name="pingback_status" id="pingback_status" value="1" <?php checked($this->options['pingback_status'],true); ?> />
<span class="description"><?php _e('Enable "X-Pingback" headers in cached pages; will always use accessed hostname as host!', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php $this->print_bool( $this->defaults['pingback_status']); ?></span>
</dd>
<dt>
<label for="sync_protocols"><?php _e("Enable sync protocolls", WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<input type="checkbox" name="sync_protocols" id="sync_protocols" value="1" <?php checked($this->options['sync_protocols'],true); ?> />
<span class="description"><?php _e('Enable to replace every protocol to the same as in the request for site\'s domain', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php $this->print_bool( $this->defaults['sync_protocols']); ?></span>
</dd>
</dl>
</fieldset>
<fieldset id="wp-ffpc-exceptions">
<legend><?php _e( 'Set cache excepions', WP_FFPC_PARAM ); ?></legend>
<dl>
<dt>
<label for="cache_loggedin"><?php _e('Enable cache for logged in users', WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<input type="checkbox" name="cache_loggedin" id="cache_loggedin" value="1" <?php checked($this->options['cache_loggedin'],true); ?> />
<span class="description"><?php _e('Cache pages even if user is logged in.', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php $this->print_bool( $this->defaults['cache_loggedin']); ?></span>
</dd>
<dt>
<label for="nocache_home"><?php _e("Don't cache home", WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<input type="checkbox" name="nocache_home" id="nocache_home" value="1" <?php checked($this->options['nocache_home'],true); ?> />
<span class="description"><?php _e('Exclude home page from caching', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php $this->print_bool( $this->defaults['nocache_home']); ?></span>
</dd>
<dt>
<label for="nocache_feed"><?php _e("Don't cache feeds", WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<input type="checkbox" name="nocache_feed" id="nocache_feed" value="1" <?php checked($this->options['nocache_feed'],true); ?> />
<span class="description"><?php _e('Exclude feeds from caching.', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php $this->print_bool( $this->defaults['nocache_feed']); ?></span>
</dd>
<dt>
<label for="nocache_archive"><?php _e("Don't cache archives", WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<input type="checkbox" name="nocache_archive" id="nocache_archive" value="1" <?php checked($this->options['nocache_archive'],true); ?> />
<span class="description"><?php _e('Exclude archives from caching.', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php $this->print_bool( $this->defaults['nocache_archive']); ?></span>
</dd>
<dt>
<label for="nocache_single"><?php _e("Don't cache posts (and single-type entries)", WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<input type="checkbox" name="nocache_single" id="nocache_single" value="1" <?php checked($this->options['nocache_single'],true); ?> />
<span class="description"><?php _e('Exclude singles from caching.', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php $this->print_bool( $this->defaults['nocache_single']); ?></span>
</dd>
<dt>
<label for="nocache_page"><?php _e("Don't cache pages", WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<input type="checkbox" name="nocache_page" id="nocache_page" value="1" <?php checked($this->options['nocache_page'],true); ?> />
<span class="description"><?php _e('Exclude pages from caching.', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php $this->print_bool( $this->defaults['nocache_page']); ?></span>
</dd>
</dl>
</fieldset>
<fieldset id="wp-ffpc-apc">
<legend><?php _e('Settings for APC', WP_FFPC_PARAM); ?></legend>
<dl>
<dt>
<label for="apc_compress"><?php _e("Compress entries", WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<input type="checkbox" name="apc_compress" id="apc_compress" value="1" <?php checked($this->options['apc_compress'],true); ?> />
<span class="description"><?php _e('Try to compress APC entries. Requires PHP ZLIB.', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php $this->print_bool( $this->defaults['apc_compress']); ?></span>
</dd>
</dl>
</fieldset>
<fieldset id="wp-ffpc-memcached">
<legend><?php _e('Settings for memcached backend', WP_FFPC_PARAM); ?></legend>
<dl>
<dt>
<label for="host"><?php _e('Host:Port', WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<input type="text" name="hosts" id="hosts" value="<?php echo $this->options['hosts']; ?>" />
<span class="description"><?php _e('List all valid Hostname:Port[,Hostname:Port] for memcached server(s)', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php echo $this->defaults['host']; ?></span>
</dd>
<dt>
<label for="persistent"><?php _e('Persistent memcache connections', WP_FFPC_PARAM); ?></label>
</dt>
<dd>
<input type="checkbox" name="persistent" id="persistent" value="1" <?php checked($this->options['persistent'],true); ?> />
<span class="description"><?php _e('Make all memcache connections persistent. Be carefull with this setting, always test the outcome.', WP_FFPC_PARAM); ?></span>
<span class="default"><?php _e('Default ', WP_FFPC_PARAM); ?>: <?php echo $this->defaults['persistent']; ?></span>
</dd>
</dl>
</fieldset>
<fieldset id="wp-ffpc-nginx">
<legend><?php _e('Sample config for nginx to utilize the data entries', WP_FFPC_PARAM); ?></legend>
<?php
$search = array( 'DATAPREFIX', 'MEMCACHEDHOST', 'MEMCACHEDPORT');
$replace = array ( $this->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 );
foreach ( array_keys( $this->options['servers'] ) as $server ) {
$nginx_servers .= " server ". $server .";\n";
}
$nginx = str_replace ( 'MEMCACHED_SERVERS' , $nginx_servers , $nginx );
?>
<pre><?php echo $nginx; ?></pre>
</fieldset>
<p class="clearcolumns">
<input class="button-primary" type="submit" name="<?php echo WP_FFPC_PARAM; ?>-save" id="<?php echo WP_FFPC_PARAM; ?>-save" value="Save Changes" />
<input class="button-secondary" style="float: right" type="submit" name="<?php echo WP_FFPC_PARAM; ?>-delete" id="<?php echo WP_FFPC_PARAM; ?>-delete" value="Delete options from DB" />
</p>
</form>
<?php
}
/**
* generates cache type 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 <select> 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 );
}
/**
* see if we are using network-wide setup or not
*
*/
function check_for_network( ) {
$this->options_key = $_SERVER['HTTP_HOST'];
if ( is_plugin_active_for_network ( WP_FFPC_PLUGIN ) )
{
/* set active for network */
$this->network = true;
/* replace settings link */
$this->settingslink = str_replace( 'options-general.php' , 'settings.php' , $this->settingslink );
/* set options key */
$this->options_key = 'network';
}
}
/**
* deactivation hook: clear advanced-cache config file
*
*/
function deactivate ( ) {
//if (@file_exists (WP_FFPC_ACACHE_MAIN_FILE))
// @unlink (WP_FFPC_ACACHE_MAIN_FILE);
$this->save_settings( false, true );
//$this->generate_config ( true );
}
/**
* delete options from database
*
*/
function delete_options () {
delete_site_option( WP_FFPC_PARAM );
wp_ffpc_log ( "plugin options deleted ");
}
/**
* invalidate cache
*
* @param $post_id
* id of post to be removed from cache entries
*/
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 <select> input field with $current set as active
*
*/
function invalidation_method ( $current , $returntext = false ) {
$e = array (
0 => 'all cached pages (WARNING! Flushes _all_ cached entrys! )',
1 => 'only modified post',
);
$this->print_select_options ( $e , $current , $returntext );
}
/**
* generates main advanced-cache config file
*
* @param $delete_current
* deletes current config settings on deactivation
*
*/
function generate_config( ) {
$acache = WP_FFPC_ACACHE_MAIN_FILE;
/* is file currently exists, delete it*/
if ( @file_exists( $acache ))
unlink ($acache);
/* is deletion was unsuccessful, die, we have no rights to do that */
if ( @file_exists( $acache ))
return false;
/* if no config left, don't create empty config */
if ( empty ( $this->all_options ) )
return false;
//if ( is_plugin_active_for_network ( WP_FFPC_PLUGIN ) && !is_plugin_active ( WP_FFPC_PLUGIN ) )
// return false;
$string = '<?php'. "\n" . 'global '. WP_FFPC_CONFIG_VAR .";\n";
$string .= WP_FFPC_CONFIG_VAR .' = ' .var_export( $this->all_options , true ) . ';';
$string .= "\n\ninclude_once ('" . WP_FFPC_ACACHE_COMMON_FILE . "');\ninclude_once ('" . WP_FFPC_ACACHE_INC_FILE . "');\n";
file_put_contents($acache, $string);
return true;
}
/**
* parameters array with default values;
*
*/
function get_options ( ) {
$defaults = array (
$wp_ffpc_defaults = array (
'hosts'=>'127.0.0.1:11211',
'expire'=>300,
'invalidation_method'=>0,
'prefix_meta' =>'meta-',
'prefix_data' =>'data-',
'charset' => 'utf-8',
'pingback_status'=> false,
'debug' => false,
'syslog' => false,
'log_info' => false,
'log' => true,
'cache_type' => 'memcached',
'cache_loggedin' => false,
'nocache_home' => false,
@ -706,225 +43,12 @@ if (!class_exists('WPFFPC')) {
'nocache_archive' => false,
'nocache_single' => false,
'nocache_page' => false,
'apc_compress' => false,
'sync_protocols' => false,
'persistent' => false,
'servers' => array (
'host' => '127.0.0.1',
'port' => 11211
),
'response_header' => false,
);
$this->defaults = $defaults;
/* maps saved options and defaults */
//$this->options = get_site_option( WP_FFPC_PARAM , $defaults, false );
$this->all_options = get_site_option( WP_FFPC_PARAM );
if ( ! empty ( $this->all_options[ $this->options_key ] ) )
$this->options = array_merge ( $defaults, $this->all_options[ $this->options_key ] );
else
$this->options = $defaults;
/* check for version number, if none, we're upgrading from 0.5, therefore we need to copy the settings and remove them after
this will run once only at all
*/
if ( empty ( $this->all_options['version'] ) )
{
foreach ( array_keys( $defaults ) as $key ) {
if ( isset ( $this->all_options[$key] ) )
{
$this->options[$key] = $this->all_options[$key];
unset ( $this->all_options[$key] );
}
}
}
}
/**
* prints `true` or `false` depending on a bool variable.
*
* @param $val
* The boolen variable to print status of.
*
*/
function print_bool ( $val ) {
$bool = $val? 'true' : 'false';
echo $bool;
}
/**
* select field processor
*
* @param sizes
* array to build <option> values of
*
* @param $current
* the current resize type
*
* @param $returntext
* boolean: is true, the description will be returned of $current type
*
* @return
* prints either description of $current
* or option list for a <select> 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)
{
?>
<option value="<?php echo $ext ?>" <?php selected( $ext , $current ); ?>>
<?php _e( $name , WP_FFPC_PARAM); ?>
</option>
<?php
}
}
/**
* function to be able to store redirects
*
* @param $redirect_url
* url of required wordpress redirect
*
* @param $requested_url
* currently unused
*
*/
function redirect_canonical($redirect_url, $requested_url) {
global $wp_nmc_redirect;
$wp_nmc_redirect = $redirect_url;
return $redirect_url;
}
/**
* save settings function
*
* @param firstrun
* boolean: true if the function is called on plugin activation
*
*/
function save_settings ( $firstrun = false, $delete_current = false ) {
if ( $delete_current )
unset ( $this->all_options[ $this->options_key ] );
else
$this->update_settings( $firstrun );
$this->all_options['version'] = WP_FFPC_VERSION;
/* save options */
update_site_option( WP_FFPC_PARAM , $this->all_options );
/* invalidate cache, this is neccessary */
$this->invalidate('system_flush');
/* if it's not for the first run, generate the config file */
if ( ! $firstrun )
$this->generate_config( );
}
/**
*
*
*/
function settings_link ( $links ) {
$settings_link = '<a href="' . $this->settingslink . '">' . __( 'Settings', WP_FFPC_PARAM ) . '</a>';
array_unshift( $links, $settings_link );
return $links;
}
/**
* splits config parameter "hosts" into an array of server string, host and port
* to be used in later config
*
*/
function split_hosts ( ) {
$servers = explode( WP_FFPC_SERVER_LIST_SEPARATOR , $this->options['hosts']);
$good_servers = array();
foreach ( $servers as $server_num => $server_string ) {
$separator = strpos( $server_string , WP_FFPC_SERVER_SEPARATOR );
$host = substr( $server_string, 0, $separator );
$port = substr( $server_string, $separator + 1 );
if ( !empty ( $host ) && !empty($port) && is_numeric($port) ) {
$good_servers[$server_string] = array (
'host' => $host,
'port' => $port
);
}
}
if ( !empty ( $good_servers ))
$this->options['servers'] = $good_servers;
}
/**
* clean up at uninstall
*
*/
function uninstall ( ) {
delete_site_option( WP_FFPC_PARAM );
wp_ffpc_log ( "plugin uninstalled ");
}
function update_settings ( $firstrun = false ) {
$options = $this->defaults;
/* only try to update defaults if it's not first run and $_POST is not empty */
if ( !$firstrun && !empty ( $_POST ) )
{
foreach ( $options as $key => $default )
{
/* $_POST element is available */
if (!empty($_POST[$key]))
{
$update = $_POST[$key];
/* get rid of slashed */
if ( strlen( $update ) !=0 &&!is_numeric($update) )
$update = stripslashes($update);
$options[$key] = $update;
}
/* empty $_POST element: when HTML form posted, empty checkboxes a 0 values will not be
part of the $_POST array, thus we need to check if this is the situation by
checking the types of the elements, since a missing value could mean update from 1 to 0
*/
elseif ( empty( $_POST[$key] ) && ( is_bool ( $default ) || is_int( $default ) ) )
{
$options[$key] = 0;
}
}
}
$this->options = $options;
/* set up server array from hosts config var */
$this->split_hosts();
$this->all_options[ $this->options_key ] = $this->options;
}
}
}
/**
* instantiate the class
*/
$wp_nmc = new WPFFPC();
$wp_ffpc = new WP_FFPC ( 'wp-ffpc', '1.0', 'WP-FFPC', $wp_ffpc_defaults, 'https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=XU3DG7LLA76WC' );
?>