digitalFAQ.com Forum

digitalFAQ.com Forum (https://www.digitalfaq.com/forum/)
-   Website and Server Troubleshooting (https://www.digitalfaq.com/forum/web-tech/)
-   -   How to use WinCache as datastore cache in vBulletin, for Windows IIS7 [notes] (https://www.digitalfaq.com/forum/web-tech/2943-how-wincache-datastore.html)

admin 03-10-2011 06:20 PM

How to use WinCache as datastore cache in vBulletin, for Windows IIS7 [notes]
 
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.


All times are GMT -5. The time now is 10:34 PM

Site design, images and content © 2002-2026 The Digital FAQ, www.digitalFAQ.com
Forum Software by vBulletin · Copyright © 2026 Jelsoft Enterprises Ltd.