memcached nginx compatibility

git-svn-id: http://plugins.svn.wordpress.org/wp-ffpc/trunk@582237 b8457f37-d9ea-0310-8a92-e5e31aec5664
This commit is contained in:
cadeyrn 2012-08-06 12:17:44 +00:00
parent 9570df8e57
commit 0b3f7eb9ae
4 changed files with 108 additions and 48 deletions

View file

@ -1,15 +1,27 @@
location / { http {
try_files $uri $uri/ @memcached; ...
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;
}
...
}
} }
...
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;
}

View file

@ -3,8 +3,8 @@ 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&currency_code=USD&bn=PP%2dDonationsBF%3acredit%2epng%3aNonHosted 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&currency_code=USD&bn=PP%2dDonationsBF%3acredit%2epng%3aNonHosted
Tags: cache, APC, memcached, full page cache Tags: cache, APC, memcached, full page cache
Requires at least: 3.0 Requires at least: 3.0
Tested up to: 3.3.1 Tested up to: 3.4.1
Stable tag: 0.3.2 Stable tag: 0.4
Fast Full Page Cache, backend can be memcached or APC Fast Full Page Cache, backend can be memcached or APC
@ -30,9 +30,10 @@ PHP has two extension for communication with a memcached server, named Memcache
(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. (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 (not Memcached!) extension, the created memcached entries can be read and served directly from nginx, making the cache insanely fast. (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 or Memcached, this feature is not available (no APC module for nginx, compression incompatibility with Memcached), although, naturally, the cache modul is functional and working, but it will be done by PHP instead of nginx. 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 is selected as cache type. 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). Some parts were based on [Hyper Cache](http://wordpress.org/extend/plugins/hyper-cache "Hyper Cache") plugin by Satollo (info@satollo.net).
@ -44,19 +45,37 @@ Some parts were based on [Hyper Cache](http://wordpress.org/extend/plugins/hyper
== Frequently Asked Questions == == Frequently Asked Questions ==
= '%3C' character on home page load = = Known bugs =
**Description**: When the page address is entered by hand, it gets redirected to `page.address/%3C`.
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. **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.
= random-like characters instead of page = 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. **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. **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, and if it's not going to be used with nginx, Memcached is better. 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 == == 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 = = 0.3.2 =
2012.02.27 2012.02.27

View file

@ -71,6 +71,8 @@ function wp_ffpc_init( $wp_ffpc_config ) {
if ( $wp_ffpc_backend == NULL ) if ( $wp_ffpc_backend == NULL )
{ {
$wp_ffpc_backend = new Memcached(); $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->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() ); $wp_ffpc_backend_status = array_key_exists( $wp_ffpc_config['host'] . ':' . $wp_ffpc_config['port'] , $wp_ffpc_backend->getStats() );
@ -111,20 +113,16 @@ function wp_ffpc_clear ( $post_id = false ) {
if ( $post_only ) if ( $post_only )
{ {
apc_delete ( $meta ); apc_delete ( $meta );
if ($wp_ffpc_config['syslog']) wp_ffpc_log ( ' clearing key: "'. $meta . '"' );
syslog( WP_FFPC_LOG_LEVEL , WP_FFPC_PARAM . ' clearing key: "'. $meta . '"' . WP_FFPC_LOG_TYPE_MSG );
apc_delete ( $data ); apc_delete ( $data );
if ($wp_ffpc_config['syslog']) wp_ffpc_log ( ' clearing key: "'. $data . '"' );
syslog( WP_FFPC_LOG_LEVEL , WP_FFPC_PARAM . ' clearing key: "'. $data . '"' . WP_FFPC_LOG_TYPE_MSG );
} }
else else
{ {
apc_clear_cache('user'); apc_clear_cache('user');
if ($wp_ffpc_config['syslog']) wp_ffpc_log ( ' flushing user cache' );
syslog( WP_FFPC_LOG_LEVEL , WP_FFPC_PARAM . ' flushing user cache' . WP_FFPC_LOG_TYPE_MSG );
apc_clear_cache('system'); apc_clear_cache('system');
if ($wp_ffpc_config['syslog']) wp_ffpc_log ( ' flushing system cache' );
syslog( WP_FFPC_LOG_LEVEL , WP_FFPC_PARAM . ' flushing system cache' . WP_FFPC_LOG_TYPE_MSG );
} }
break; break;
@ -135,17 +133,14 @@ function wp_ffpc_clear ( $post_id = false ) {
if ( $post_only ) if ( $post_only )
{ {
$wp_ffpc_backend->delete( $meta ); $wp_ffpc_backend->delete( $meta );
if ($wp_ffpc_config['syslog']) wp_ffpc_log ( ' clearing key: "'. $meta . '"' );
syslog( WP_FFPC_LOG_LEVEL , WP_FFPC_PARAM . ' clearing key: "'. $meta . '"' . WP_FFPC_LOG_TYPE_MSG );
$wp_ffpc_backend->delete( $data ); $wp_ffpc_backend->delete( $data );
if ($wp_ffpc_config['syslog']) wp_ffpc_log ( ' clearing key: "'. $data . '"' );
syslog( WP_FFPC_LOG_LEVEL , WP_FFPC_PARAM . ' clearing key: "'. $data . '"' . WP_FFPC_LOG_TYPE_MSG );
} }
else else
{ {
$wp_ffpc_backend->flush(); $wp_ffpc_backend->flush();
if ($wp_ffpc_config['syslog']) wp_ffpc_log ( ' flushing cache' );
syslog( WP_FFPC_LOG_LEVEL , WP_FFPC_PARAM . ' flushing cache' . WP_FFPC_LOG_TYPE_MSG );
} }
break; break;
@ -167,6 +162,8 @@ function wp_ffpc_set ( &$key, &$data, $compress = false ) {
global $wp_ffpc_config; global $wp_ffpc_config;
global $wp_ffpc_backend; global $wp_ffpc_backend;
$exp = $wp_ffpc_config['user_logged_in'] ? $wp_ffpc_config['expire_member'] : $wp_ffpc_config['expire_visitor'];
/* syslog */ /* syslog */
if ($wp_ffpc_config['syslog']) if ($wp_ffpc_config['syslog'])
{ {
@ -176,7 +173,7 @@ function wp_ffpc_set ( &$key, &$data, $compress = false ) {
$string = $data; $string = $data;
$size = strlen($string); $size = strlen($string);
syslog( WP_FFPC_LOG_LEVEL , WP_FFPC_PARAM . ' set key: "'. $key . '", size: '. $size . ' byte(s)' . WP_FFPC_LOG_TYPE_MSG ); wp_ffpc_log ( ' set key: "'. $key . '", size: '. $size . ' byte(s)' );
} }
switch ($wp_ffpc_config['cache_type']) switch ($wp_ffpc_config['cache_type'])
@ -185,18 +182,18 @@ function wp_ffpc_set ( &$key, &$data, $compress = false ) {
/* use apc_store to overwrite data is existed */ /* use apc_store to overwrite data is existed */
if ( $compress ) if ( $compress )
$data = gzdeflate ( $data , 1 ); $data = gzdeflate ( $data , 1 );
return apc_store( $key , $data , $wp_ffpc_config['expire']); return apc_store( $key , $data , $exp );
break; break;
case 'memcache': case 'memcache':
if ( $wp_ffpc_backend != NULL ) if ( $wp_ffpc_backend != NULL )
/* false to disable compression, vital for nginx */ /* false to disable compression, vital for nginx */
$wp_ffpc_backend->set ( $key, $data , false, $wp_ffpc_config['expire'] ); $wp_ffpc_backend->set ( $key, $data , false, $exp );
else else
return false; return false;
break; break;
case 'memcached': case 'memcached':
if ( $wp_ffpc_backend != NULL ) if ( $wp_ffpc_backend != NULL )
$wp_ffpc_backend->set ( $key, $data , $wp_ffpc_config['expire'] ); $wp_ffpc_backend->set ( $key, $data , $exp );
else else
return false; return false;
break; break;
@ -214,8 +211,7 @@ function wp_ffpc_get( &$key , $uncompress = false ) {
global $wp_ffpc_backend; global $wp_ffpc_backend;
/* syslog */ /* syslog */
if ($wp_ffpc_config['syslog']) wp_ffpc_log ( ' get key: "'.$key . '"' );
syslog( WP_FFPC_LOG_LEVEL , WP_FFPC_PARAM . ' get key: "'.$key . '"' . WP_FFPC_LOG_TYPE_MSG );
switch ($wp_ffpc_config['cache_type']) switch ($wp_ffpc_config['cache_type'])
{ {
@ -234,4 +230,19 @@ function wp_ffpc_get( &$key , $uncompress = false ) {
return false; 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 );
}
?> ?>

View file

@ -1,7 +1,7 @@
<?php <?php
/* /*
Plugin Name: WP-FFPC Plugin Name: WP-FFPC
Version: 0.3.2 Version: 0.4
Plugin URI: http://petermolnar.eu/wordpress/wp-ffpc Plugin URI: http://petermolnar.eu/wordpress/wp-ffpc
Description: Fast Full Page Cache, backend can be memcached or APC Description: Fast Full Page Cache, backend can be memcached or APC
Author: Peter Molnar Author: Peter Molnar
@ -26,9 +26,27 @@ License: GPL2
*/ */
/**
* 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;
}
}
/* fix */ /* fix */
if ( ! defined( 'WP_PLUGIN_URL' ) ) if ( ! defined( 'WP_PLUGIN_URL_' ) )
define( 'WP_PLUGIN_URL', get_option( 'siteurl' ) . '/wp-content/plugins' ); {
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' ) ) if ( ! defined( 'WP_PLUGIN_DIR' ) )
define( 'WP_PLUGIN_DIR', ABSPATH . 'wp-content/plugins' ); define( 'WP_PLUGIN_DIR', ABSPATH . 'wp-content/plugins' );
@ -36,7 +54,7 @@ if ( ! defined( 'WP_PLUGIN_DIR' ) )
define ( 'WP_FFPC_PARAM' , 'wp-ffpc' ); define ( 'WP_FFPC_PARAM' , 'wp-ffpc' );
define ( 'WP_FFPC_OPTION_GROUP' , 'wp-ffpcparams' ); define ( 'WP_FFPC_OPTION_GROUP' , 'wp-ffpcparams' );
define ( 'WP_FFPC_OPTIONS_PAGE' , 'wp-ffpcoptions' ); define ( 'WP_FFPC_OPTIONS_PAGE' , 'wp-ffpcoptions' );
define ( 'WP_FFPC_URL' , WP_PLUGIN_URL . '/' . WP_FFPC_PARAM ); define ( 'WP_FFPC_URL' , WP_PLUGIN_URL_ . '/' . WP_FFPC_PARAM );
define ( 'WP_FFPC_DIR' , WP_PLUGIN_DIR . '/' . 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_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_MAIN_FILE' , ABSPATH . 'wp-content/advanced-cache.php' );
@ -173,7 +191,7 @@ if (!class_exists('WPFFPC')) {
<?php endif; ?> <?php endif; ?>
<div class="wrap"> <div class="wrap">
<h2><?php _e( 'NMC settings', WP_FFPC_PARAM ) ; ?></h2> <h2><?php _e( 'WP-FFPC settings', WP_FFPC_PARAM ) ; ?></h2>
<form method="post" action="#"> <form method="post" action="#">
<fieldset> <fieldset>
@ -370,7 +388,7 @@ if (!class_exists('WPFFPC')) {
</dl> </dl>
</fieldset> </fieldset>
<?php if ( $this->options['cache_type'] == 'memcache' ) : ?> <?php if ( $this->options['cache_type'] == 'memcache' || $this->options['cache_type'] == 'memcached' ) : ?>
<fieldset class="grid50"> <fieldset class="grid50">
<legend><?php _e('Sample config for nginx to utilize the data entries', WP_FFPC_PARAM); ?></legend> <legend><?php _e('Sample config for nginx to utilize the data entries', WP_FFPC_PARAM); ?></legend>