Requirements:
- vBulletin 3.7.x or 3.8.x,
- WinCache 1.1 or higher
STEP 1 -- Add the following code to the end of
class_datastore.php, just above
?> code
Code:
// #############################################################################
// WINCACHE
/**
* Class for fetching and initializing the vBulletin datastore from WINCACHE
*/
class vB_Datastore_WINCACHE extends vB_Datastore
{
/**
* Indicates if the result of a call to the register function should store the value in memory
*
* @var boolean
*/
var $store_result = false;
/**
* Fetches the contents of the datastore from WINCACHE
*
* @param array Array of items to fetch from the datastore
*
* @return void
*/
function fetch($itemarray)
{
if (!function_exists('wincache_ucache_get'))
{
trigger_error('WINCACHE not installed', E_USER_ERROR);
}
$db =& $this->dbobject;
$itemlist = array();
foreach ($this->defaultitems AS $item)
{
$this->do_fetch($item, $itemlist);
}
if (is_array($itemarray))
{
foreach ($itemarray AS $item)
{
$this->do_fetch($item, $itemlist);
}
}
$this->store_result = true;
// some of the items we are looking for were not found, lets get them in one go
if (!empty($itemlist))
{
$this->do_db_fetch(implode(',', $itemlist));
}
$this->check_options();
// set the version number variable
$this->registry->versionnumber =& $this->registry->options['templateversion'];
}
/**
* Fetches the data from shared memory and detects errors
*
* @param string title of the datastore item
* @param array A reference to an array of items that failed and need to fetched from the database
*
* @return boolean
*/
function do_fetch($title, &$itemlist)
{
$ptitle = $this->prefix . $title;
if (($data = wincache_ucache_get($ptitle)) === false)
{ // appears its not there, lets grab the data, lock the shared memory and put it in
$itemlist[] = "'" . $this->dbobject->escape_string($title) . "'";
return false;
}
$this->register($title, $data);
return true;
}
/**
* Sorts the data returned from the cache and places it into appropriate places
*
* @param string The name of the data item to be processed
* @param mixed The data associated with the title
*
* @return void
*/
function register($title, $data, $unserialize_detect = 2)
{
if ($this->store_result === true)
{
$this->build($title, $data);
}
parent::register($title, $data, $unserialize_detect);
}
/**
* Updates the appropriate cache file
*
* @param string title of the datastore item
* @param mixed The data associated with the title
*
* @return void
*/
function build($title, $data)
{
$ptitle = $this->prefix . $title;
//The below line is not required as wincache_ucache_set will override the data if it is already present
//wincache_ucache_delete($ptitle);
wincache_ucache_set($ptitle, $data);
}
}
STEP 2 -- Set includes\config.php to use WinCache as the datastore:
Code:
$config['Datastore']['class'] = 'vB_Datastore_WINCACHE';
Check the "User and Session Cache" section of wincache.php in your browser to see stats.
Note that wincache.php was a test file that came with WinCache, and must be placed into the domain folder with your vBulletin install. The PHP file will not work until the username/password is changed, which can only be done after the read-only file is temporarily made writable. WinCache only works on a Windows 2008 IIS 7 server, and is an optional module that must be installed from IIS.net.