[aur-dev] [PATCH 1/1] Make cache type selectable based on config value
Lukas Fleischer
archlinux at cryptocrack.de
Tue Jun 21 09:33:56 EDT 2011
On Sun, May 29, 2011 at 04:27:55PM -0700, elij wrote:
> Provie a mechanism to specify cache type from NONE, APC, or MEMCACHE
> based on a config variable.
>
> If MEMCACHE type is selected, a list of servers can be specified to
> provide multiserver support. Note that php-memcaced is required for
> MEMCACHE support.
Sorry for the late response, I was very busy recently. Did you actually
test MEMCACHE support? I'm still too busy to setup and test less
important stuff thoroughly but I trust your judgement, especially since
this will probably be rarely used.
> ---
> web/lib/aur.inc.php | 49 +-----------------------
> web/lib/cachefuncs.inc.php | 85 ++++++++++++++++++++++++++++++++++++++++++
> web/lib/config.inc.php.proto | 10 +++++
> 3 files changed, 96 insertions(+), 48 deletions(-)
> create mode 100644 web/lib/cachefuncs.inc.php
>
> diff --git a/web/lib/aur.inc.php b/web/lib/aur.inc.php
> index 7cf43e6..e65677d 100644
> --- a/web/lib/aur.inc.php
> +++ b/web/lib/aur.inc.php
> @@ -13,12 +13,7 @@ set_lang();
> include_once("config.inc.php");
> include_once("version.inc.php");
> include_once("acctfuncs.inc.php");
> -
> -# Check if APC extension is loaded, and set cache prefix if it is
> -if (!defined('EXTENSION_LOADED_APC')) {
> - define('EXTENSION_LOADED_APC', extension_loaded('apc'));
> - define('APC_PREFIX', 'aur:');
> -}
> +include_once("cachefuncs.inc.php");
>
> # see if the visitor is already logged in
> #
> @@ -263,48 +258,6 @@ function db_query($query="", $db_handle="") {
> return $result;
> }
>
> -# set a value in the cache (currently apc) if cache
> -# is available for use. if not available, this becomes
> -# effectively a no-op (return value is false)
> -# accepts an optional TTL (defaults to 600 seconds)
> -function set_cache_value($key, $value, $ttl=600) {
> - $status = false;
> - if (EXTENSION_LOADED_APC) {
> - $status = apc_store(APC_PREFIX.$key, $value, $ttl);
> - }
> - return $status;
> -}
> -
> -# get a value from the cache (currently apc) if cache
> -# is available for use. if not available, this
> -# returns false (optionally sets passed in variable $status
> -# to false, much like apc_fetch behaves). this allows
> -# for testing the fetch result appropriately even in the event
> -# that a 'false' value was the value in the cache.
> -function get_cache_value($key, &$status=false) {
> - if(EXTENSION_LOADED_APC) {
> - $ret = apc_fetch(APC_PREFIX.$key, $status);
> - if ($status) {
> - return $ret;
> - }
> - }
> - return $status;
> -}
> -
> -# run a simple db query, retrieving and/or caching the value if APC
> -# is available for use
> -# accepts an optioanal TTL value (defaults to 600 seconds)
> -function db_cache_value($dbq, $dbh, $key, $ttl=600) {
> - $status = false;
> - $value = get_cache_value($key, $status);
> - if (!$status) {
> - $result = db_query($dbq, $dbh);
> - $row = mysql_fetch_row($result);
> - $value = $row[0];
> - set_cache_value($key, $value, $ttl);
> - }
> - return $value;
> -}
>
> # set up the visitor's language
> #
> diff --git a/web/lib/cachefuncs.inc.php b/web/lib/cachefuncs.inc.php
> new file mode 100644
> index 0000000..8e32370
> --- /dev/null
> +++ b/web/lib/cachefuncs.inc.php
> @@ -0,0 +1,85 @@
> +<?php
> +
> +if (!defined('CACHE_TYPE')) {
> + define('CACHE_TYPE', 'NONE');
> +}
> +
> +# Check if APC extension is loaded, and set cache prefix if it is
> +if (CACHE_TYPE == 'APC' && !defined('EXTENSION_LOADED_APC')) {
> + define('EXTENSION_LOADED_APC', extension_loaded('apc'));
> + define('CACHE_PREFIX', 'aur:');
> +}
> +
> +# Check if memcache extension is loaded, and set cache prefix if it is
> +if (CACHE_TYPE == 'MEMCACHE' && !defined('EXTENSION_LOADED_MEMCACHE')) {
> + define('EXTENSION_LOADED_MEMCACHE', extension_loaded('memcached'));
> + define('CACHE_PREFIX', 'aur:');
> + global $memcache;
> + $memcache = new Memcached();
> + $mcs = defined('MEMCACHE_SERVERS') ? MEMCACHE_SERVERS : '127.0.0.1:11211';
> + foreach (explode(',', $mcs) as $elem) {
> + $telem = trim($elem);
> + $mcserver = explode(':', $telem);
> + $memcache->addServer($mcserver[0], intval($mcserver[1]));
> + }
> +}
> +
> +# set a value in the cache (currently apc) if cache
> +# is available for use. if not available, this becomes
> +# effectively a no-op (return value is false)
> +# accepts an optional TTL (defaults to 600 seconds)
> +function set_cache_value($key, $value, $ttl=600) {
> + $status = false;
> + if (defined('EXTENSION_LOADED_APC')) {
> + $status = apc_store(CACHE_PREFIX.$key, $value, $ttl);
> + }
> + if (defined('EXTENSION_LOADED_MEMCACHE')) {
> + global $memcache;
> + $status = $memcache->set(CACHE_PREFIX.$key, $value, $ttl);
> + }
> + return $status;
> +}
> +
> +# get a value from the cache (currently apc) if cache
> +# is available for use. if not available, this
> +# returns false (optionally sets passed in variable $status
> +# to false, much like apc_fetch behaves). this allows
> +# for testing the fetch result appropriately even in the event
> +# that a 'false' value was the value in the cache.
> +function get_cache_value($key, &$status=false) {
> + if(defined('EXTENSION_LOADED_APC')) {
> + $ret = apc_fetch(CACHE_PREFIX.$key, $status);
> + if ($status) {
> + return $ret;
> + }
> + }
> + if (defined('EXTENSION_LOADED_MEMCACHE')) {
> + global $memcache;
> + $ret = $memcache->get(CACHE_PREFIX.$key);
> + if (!$ret) {
> + $status = false;
> + }
> + else {
> + $status = true;
> + }
> + return $ret;
> + }
> + return $status;
> +}
> +
> +# run a simple db query, retrieving and/or caching the value if APC
> +# is available for use
> +# accepts an optioanal TTL value (defaults to 600 seconds)
> +function db_cache_value($dbq, $dbh, $key, $ttl=600) {
> + $status = false;
> + $value = get_cache_value($key, $status);
> + if (!$status) {
> + $result = db_query($dbq, $dbh);
> + $row = mysql_fetch_row($result);
> + $value = $row[0];
> + set_cache_value($key, $value, $ttl);
> + }
> + return $value;
> +}
> +
> +?>
> diff --git a/web/lib/config.inc.php.proto b/web/lib/config.inc.php.proto
> index 43c64d2..5351a4a 100644
> --- a/web/lib/config.inc.php.proto
> +++ b/web/lib/config.inc.php.proto
> @@ -24,6 +24,16 @@ define("DEFAULT_LANG", "en");
> # development. Should not be enabled in production. Default to 0 (off).
> define("SQL_DEBUG", 0);
>
> +# set cache type. Either "APC", "MEMCACHE", or "NONE"
> +# defaults to NONE
> +#
Please try to match our commenting style. We are case sensitive, use
punctuation and use uppercase when starting a new sentence. Check the
other comments in this file.
It would be cool if you could pay attention to our style and commenting
guidelines everywhere (even tho there's a lot of legacy code that
doesn't match them, too) but this is particularly striking here.
> +#define("CACHE_TYPE", "APC");
> +#define("CACHE_TYPE", "MEMCACHE");
> +# if using memcache cache_type, list servers. you can separate multiple
> +# servers with a comma, ex: '127.0.0.1:11211,127.0.0.1:11212'
> +# if undefined, defaults to '127.0.0.1:11211'
> +#define("MEMCACHE_SERVERS", '127.0.0.1:11211');
> +
> # Languages we have translations for
> $SUPPORTED_LANGS = array(
> "ca" => "Català",
> --
> 1.7.2.5
More information about the aur-dev
mailing list