function set($key, $value)
 {
     parent::set($key, $value);
     // caching is turned off
     if (!$GLOBALS['external_cache_enabled']) {
         return;
     }
     $external_key = $this->_realKey($key);
     if (EXTERNAL_CACHE_DEBUG) {
         SugarCache::log("Step 3: Converting key ({$key}) to external key ({$external_key})");
     }
     output_cache_put($external_key, serialize($value));
     if (EXTERNAL_CACHE_DEBUG) {
         SugarCache::log("Step 4: Added key to Zend cache {$external_key} with value ({$value}) to be stored for " . EXTERNAL_CACHE_INTERVAL_SECONDS . " seconds");
     }
 }
Exemple #2
0
function cache_put_data($key, $value, $ttl = 120)
{
    global $boardurl, $sourcedir, $modSettings, $memcached;
    global $cache_hits, $cache_count, $db_show_debug;
    if (empty($modSettings['cache_enable']) && !empty($modSettings)) {
        return;
    }
    $cache_count = isset($cache_count) ? $cache_count + 1 : 1;
    if (isset($db_show_debug) && $db_show_debug === true) {
        $cache_hits[$cache_count] = array('k' => $key, 'd' => 'put', 's' => $value === null ? 0 : strlen(serialize($value)));
        $st = microtime();
    }
    $key = md5($boardurl . filemtime($sourcedir . '/Load.php')) . '-SMF-' . $key;
    $value = $value === null ? null : serialize($value);
    // The simple yet efficient memcached.
    if (function_exists('memcache_set') && isset($modSettings['cache_memcached']) && trim($modSettings['cache_memcached']) != '') {
        // Not connected yet?
        if (empty($memcached)) {
            get_memcached_server();
        }
        if (!$memcached) {
            return;
        }
        memcache_set($memcached, $key, $value, 0, $ttl);
    } elseif (function_exists('eaccelerator_put')) {
        if (mt_rand(0, 10) == 1) {
            eaccelerator_gc();
        }
        if ($value === null) {
            @eaccelerator_rm($key);
        } else {
            eaccelerator_put($key, $value, $ttl);
        }
    } elseif (function_exists('mmcache_put')) {
        if (mt_rand(0, 10) == 1) {
            mmcache_gc();
        }
        if ($value === null) {
            @mmcache_rm($key);
        } else {
            mmcache_put($key, $value, $ttl);
        }
    } elseif (function_exists('apc_store')) {
        // An extended key is needed to counteract a bug in APC.
        if ($value === null) {
            apc_delete($key . 'smf');
        } else {
            apc_store($key . 'smf', $value, $ttl);
        }
    } elseif (function_exists('output_cache_put')) {
        output_cache_put($key, $value);
    }
    if (isset($db_show_debug) && $db_show_debug === true) {
        $cache_hits[$cache_count]['t'] = array_sum(explode(' ', microtime())) - array_sum(explode(' ', $st));
    }
}
 /**
  * Save some string datas into a cache record
  *
  * Note : $data is always "string" (serialization is done by the
  * core not by the backend)
  *
  * @param string $data data to cache
  * @param string $id cache id
  * @param array $tags array of strings, the cache record will be tagged by each string entry
  * @param int $specificLifetime if != false, set a specific lifetime for this cache record (null => infinite lifetime)
  * @return boolean true if no problem
  */
 public function save($data, $id, $tags = array(), $specificLifetime = false)
 {
     if (!($specificLifetime === false)) {
         $this->_log("Zend_Cache_Backend_ZendPlatform::save() : non false specifc lifetime is unsuported for this backend");
     }
     $lifetime = $this->_directives['lifetime'];
     $result1 = output_cache_put($id, array($data, time()));
     $result2 = count($tags) == 0;
     foreach ($tags as $tag) {
         $tagid = self::TAGS_PREFIX . $tag;
         $old_tags = output_cache_get($tagid, $lifetime);
         if ($old_tags === false) {
             $old_tags = array();
         }
         $old_tags[$id] = $id;
         $result2 = output_cache_put($tagid, $old_tags);
     }
     return $result1 && $result2;
 }
Exemple #4
0
/**
 * Put data in the cache
 *
 * Adds data to whatever cache method we're using
 *
 * @param  string $key the cache data identifier
 * @param  mixed $value the value to be stored
 * @param  int $ttl how long are we going to cache this data (in seconds)
 * @return void
 * @since  0.1.0
 */
function smfapi_cachePutData($key, $value, $ttl = 120)
{
    global $boardurl, $sourcedir, $modSettings, $memcached;
    global $cache_hits, $cache_count, $db_show_debug, $cachedir;
    if (empty($modSettings['cache_enable']) && !empty($modSettings)) {
        return;
    }
    $cache_count = isset($cache_count) ? $cache_count + 1 : 1;
    if (isset($db_show_debug) && $db_show_debug === true) {
        $cache_hits[$cache_count] = array('k' => $key, 'd' => 'put', 's' => $value === null ? 0 : strlen(serialize($value)));
        $st = microtime();
    }
    $key = md5($boardurl . filemtime($sourcedir . '/Load.php')) . '-SMF-' . strtr($key, ':', '-');
    $value = $value === null ? null : serialize($value);
    // eAccelerator...
    if (function_exists('eaccelerator_put')) {
        if (mt_rand(0, 10) == 1) {
            eaccelerator_gc();
        }
        if ($value === null) {
            @eaccelerator_rm($key);
        } else {
            eaccelerator_put($key, $value, $ttl);
        }
    } elseif (function_exists('mmcache_put')) {
        if (mt_rand(0, 10) == 1) {
            mmcache_gc();
        }
        if ($value === null) {
            @mmcache_rm($key);
        } else {
            mmcache_put($key, $value, $ttl);
        }
    } elseif (function_exists('apc_store')) {
        // An extended key is needed to counteract a bug in APC.
        if ($value === null) {
            apc_delete($key . 'smf');
        } else {
            apc_store($key . 'smf', $value, $ttl);
        }
    } elseif (function_exists('output_cache_put')) {
        output_cache_put($key, $value);
    } elseif (function_exists('xcache_set') && ini_get('xcache.var_size') > 0) {
        if ($value === null) {
            xcache_unset($key);
        } else {
            xcache_set($key, $value, $ttl);
        }
    } else {
        if ($value === null) {
            @unlink($cachedir . '/data_' . $key . '.php');
        } else {
            $cache_data = '<' . '?' . 'php if (!defined(\'SMF\')) die; if (' . (time() + $ttl) . ' < time()) $expired = true; else{$expired = false; $value = \'' . addcslashes($value, '\\\'') . '\';}' . '?' . '>';
            $fh = @fopen($cachedir . '/data_' . $key . '.php', 'w');
            if ($fh) {
                // write the file.
                set_file_buffer($fh, 0);
                flock($fh, LOCK_EX);
                $cache_bytes = fwrite($fh, $cache_data);
                flock($fh, LOCK_UN);
                fclose($fh);
                // check that the cache write was successful; all the data should be written
                // if it fails due to low diskspace, remove the cache file
                if ($cache_bytes != strlen($cache_data)) {
                    @unlink($cachedir . '/data_' . $key . '.php');
                }
            }
        }
    }
    if (isset($db_show_debug) && $db_show_debug === true) {
        $cache_hits[$cache_count]['t'] = array_sum(explode(' ', microtime())) - array_sum(explode(' ', $st));
    }
    return;
}
Exemple #5
0
 /**
  * Store a value in cache.
  * 
  * @param string $key
  * @param mixed $value
  * @param int $ttl = 120
  */
 public static function putCache($key, $value, $ttl = 120)
 {
     if (-1 == self::$API) {
         return;
     }
     self::$cache_count++;
     if (self::$want_debug) {
         self::$cache_hits[self::$cache_count] = array('k' => $key, 'd' => 'put', 's' => $value === null ? 0 : strlen(serialize($value)));
         $st = microtime();
     }
     $key = self::$basekey . strtr($key, ':', '-');
     $value = $value === null ? null : serialize($value);
     switch (self::$API) {
         case 5:
             $key = str_replace(' ', '_', $key);
             $instance = self::getMemcachedServer();
             $instance->set($key, $value, $ttl);
             break;
         case 4:
             if (empty(self::$memcached)) {
                 self::getMemcacheServer();
             }
             if (!self::$memcached) {
                 return;
             }
             memcache_set(self::$memcached, $key, $value, 0, $ttl);
             break;
         case 1:
             // An extended key is needed to counteract a bug in APC.
             if ($value === null) {
                 apc_delete($key . 'smf');
             } else {
                 apc_store($key . 'smf', $value, $ttl);
             }
             break;
         case 3:
             output_cache_put($key, $value);
             break;
         case 2:
             if ($value === null) {
                 xcache_unset($key);
             } else {
                 xcache_set($key, $value, $ttl);
             }
             break;
         case 0:
             if ($value === null) {
                 @unlink(self::$cachedir . '/data_' . $key . '.php');
             } else {
                 $cache_data = '<' . '?' . 'php if (!defined(\'SMF\')) die; if (' . (time() + $ttl) . ' < time()) $expired = true; else{$expired = false; $value = \'' . addcslashes($value, '\\\'') . '\';}' . '?' . '>';
                 $fh = @fopen(self::$cachedir . '/data_' . $key . '.php', 'w');
                 if ($fh) {
                     // Write the file.
                     set_file_buffer($fh, 0);
                     flock($fh, LOCK_EX);
                     $cache_bytes = fwrite($fh, $cache_data);
                     flock($fh, LOCK_UN);
                     fclose($fh);
                     // Check that the cache write was successful; all the data should be written
                     // If it fails due to low diskspace, remove the cache file
                     if ($cache_bytes != strlen($cache_data)) {
                         @unlink(self::$cachedir . '/data_' . $key . '.php');
                     }
                 }
             }
             break;
     }
     if (isset($db_show_debug) && $db_show_debug === true) {
         self::$cache_hits[self::$cache_count]['t'] = array_sum(explode(' ', microtime())) - array_sum(explode(' ', $st));
     }
 }
Exemple #6
0
 /**
  * Save cache content into the ZendPlatform storage.
  * Data is already serialized.
  *
  * @param   string  $data    Data to store.
  * @return  void
  */
 public function store($data)
 {
     $this->clean();
     output_cache_put($this->getIdMd5(), [$data, time()]);
     return;
 }
Exemple #7
0
/**
 * Puts value in the cache under key for ttl seconds.
 *
 * - It may "miss" so shouldn't be depended on
 * - Uses the cache engine chosen in the ACP and saved in settings.php
 * - It supports:
 *     Turck MMCache: http://turck-mmcache.sourceforge.net/index_old.html#api
 *     Xcache: http://xcache.lighttpd.net/wiki/XcacheApi
 *     memcache: http://www.php.net/memcache
 *     APC: http://www.php.net/apc
 *     eAccelerator: http://bart.eaccelerator.net/doc/phpdoc/
 *     Zend: http://files.zend.com/help/Zend-Platform/output_cache_functions.htm
 *     Zend: http://files.zend.com/help/Zend-Platform/zend_cache_functions.htm
 *
 * @param string $key
 * @param string|int|mixed[]|null $value
 * @param int $ttl = 120
 */
function cache_put_data($key, $value, $ttl = 120)
{
    global $cache_memcached, $memcached, $cache_hits, $cache_count, $db_show_debug;
    global $cache_accelerator, $cache_enable;
    if (empty($cache_enable)) {
        return;
    }
    $cache_count = isset($cache_count) ? $cache_count + 1 : 1;
    if (isset($db_show_debug) && $db_show_debug === true) {
        $cache_hits[$cache_count] = array('k' => $key, 'd' => 'put', 's' => $value === null ? 0 : strlen(serialize($value)));
        $st = microtime(true);
    }
    $key = cache_get_key($key);
    $value = $value === null ? null : serialize($value);
    switch ($cache_accelerator) {
        case 'memcached':
            // The simple yet efficient memcached.
            if (function_exists('memcached_set') || function_exists('memcache_set') && !empty($cache_memcached)) {
                // Not connected yet?
                if (empty($memcached)) {
                    get_memcached_server();
                }
                if (!$memcached) {
                    return;
                }
                memcache_set($memcached, $key, $value, 0, $ttl);
            }
            break;
        case 'eaccelerator':
            // eAccelerator...
            if (function_exists('eaccelerator_put')) {
                if (mt_rand(0, 10) == 1) {
                    eaccelerator_gc();
                }
                if ($value === null) {
                    @eaccelerator_rm($key);
                } else {
                    eaccelerator_put($key, $value, $ttl);
                }
            }
            break;
        case 'mmcache':
            // Turck MMCache?
            if (function_exists('mmcache_put')) {
                if (mt_rand(0, 10) == 1) {
                    mmcache_gc();
                }
                if ($value === null) {
                    @mmcache_rm($key);
                } else {
                    mmcache_lock($key);
                    mmcache_put($key, $value, $ttl);
                    mmcache_unlock($key);
                }
            }
            break;
        case 'apc':
        case 'apcu':
            // Alternative PHP Cache, ahoy!
            if (function_exists('apc_store')) {
                // An extended key is needed to counteract a bug in APC.
                if ($value === null) {
                    apc_delete($key . 'elkarte');
                } else {
                    apc_store($key . 'elkarte', $value, $ttl);
                }
            }
            break;
        case 'zend':
            // Zend Platform/ZPS/etc.
            if (function_exists('zend_shm_cache_store')) {
                zend_shm_cache_store('ELK::' . $key, $value, $ttl);
            } elseif (function_exists('output_cache_put')) {
                output_cache_put($key, $value);
            }
            break;
        case 'xcache':
            if (function_exists('xcache_set') && ini_get('xcache.var_size') > 0) {
                if ($value === null) {
                    xcache_unset($key);
                } else {
                    xcache_set($key, $value, $ttl);
                }
            }
            break;
        default:
            // Otherwise custom cache?
            if ($value === null) {
                @unlink(CACHEDIR . '/data_' . $key . '.php');
            } else {
                $cache_data = '<' . '?' . 'php if (!defined(\'ELK\')) die; if (' . (time() + $ttl) . ' < time()) $expired = true; else{$expired = false; $value = \'' . addcslashes($value, '\\\'') . '\';}';
                // Write out the cache file, check that the cache write was successful; all the data must be written
                // If it fails due to low diskspace, or other, remove the cache file
                if (@file_put_contents(CACHEDIR . '/data_' . $key . '.php', $cache_data, LOCK_EX) !== strlen($cache_data)) {
                    @unlink(CACHEDIR . '/data_' . $key . '.php');
                }
            }
            break;
    }
    if (function_exists('call_integration_hook')) {
        call_integration_hook('cache_put_data', array($key, $value, $ttl));
    }
    if (isset($db_show_debug) && $db_show_debug === true) {
        $cache_hits[$cache_count]['t'] = microtime(true) - $st;
    }
}
Exemple #8
0
 /**
  * Write data to cache.
  *
  * @param string $id cache id
  *
  * @param string $data
  *
  * @return bool success
  */
 public function store($id, $data)
 {
     return output_cache_put($id, "{$_SERVER['REQUEST_TIME']}|{$data}");
 }
 /**
  * Save some string datas into a cache record
  *
  * Note : $data is always "string" (serialization is done by the
  * core not by the backend)
  *
  * @param string $data data to cache
  * @param string $id cache id
  * @param array $tags array of strings, the cache record will be tagged by each string entry
  * *                  This option is not supported in this backend
  * @return boolean true if no problem
  */
 public function save($data, $id, $tags = array())
 {
     $result = output_cache_put($id, array($data, time()));
     if (count($tags) > 0) {
         foreach ($tags as $tag) {
             $tagid = self::TAGS_PREFIX . $tag;
             $old_tags = output_cache_get($tagid, $this->_directives['lifeTime']);
             if ($old_tags === false) {
                 $old_tags = array();
             }
             $old_tags[$id] = $id;
             output_cache_put($tagid, $old_tags);
         }
     }
     return $result;
 }
Exemple #10
0
function cache_put_data($key, $value, $ttl = 120)
{
    global $boardurl, $sourcedir, $modSettings, $memcached;
    global $cache_hits, $cache_count, $db_show_debug, $cachedir;
    if (empty($modSettings['cache_enable']) && !empty($modSettings)) {
        return;
    }
    $cache_count = isset($cache_count) ? $cache_count + 1 : 1;
    if (isset($db_show_debug) && $db_show_debug === true) {
        $cache_hits[$cache_count] = array('k' => $key, 'd' => 'put', 's' => $value === null ? 0 : strlen(serialize($value)));
        $st = microtime();
    }
    $key = md5($boardurl . filemtime($sourcedir . '/Load.php')) . '-SMF-' . strtr($key, ':', '-');
    $value = $value === null ? null : serialize($value);
    // The simple yet efficient memcached.
    if (function_exists('memcache_set') && isset($modSettings['cache_memcached']) && trim($modSettings['cache_memcached']) != '') {
        // Not connected yet?
        if (empty($memcached)) {
            get_memcached_server();
        }
        if (!$memcached) {
            return;
        }
        memcache_set($memcached, $key, $value, 0, $ttl);
    } elseif (function_exists('eaccelerator_put')) {
        if (mt_rand(0, 10) == 1) {
            eaccelerator_gc();
        }
        if ($value === null) {
            @eaccelerator_rm($key);
        } else {
            eaccelerator_put($key, $value, $ttl);
        }
    } elseif (function_exists('mmcache_put')) {
        if (mt_rand(0, 10) == 1) {
            mmcache_gc();
        }
        if ($value === null) {
            @mmcache_rm($key);
        } else {
            mmcache_put($key, $value, $ttl);
        }
    } elseif (function_exists('apc_store')) {
        // An extended key is needed to counteract a bug in APC.
        if ($value === null) {
            apc_delete($key . 'smf');
        } else {
            apc_store($key . 'smf', $value, $ttl);
        }
    } elseif (function_exists('output_cache_put')) {
        output_cache_put($key, $value);
    } elseif (function_exists('xcache_set') && ini_get('xcache.var_size') > 0) {
        if ($value === null) {
            xcache_unset($key);
        } else {
            xcache_set($key, $value, $ttl);
        }
    } elseif (function_exists('fwrite')) {
        if ($value === null) {
            @unlink($cachedir . '/data_' . $key . '.php');
        } else {
            $fp = @fopen($cachedir . '/data_' . $key . '.php', 'w');
            if ($fp) {
                // Write the header.
                @flock($fp, LOCK_EX);
                fwrite($fp, '<' . '?' . 'php if (!defined(\'SMF\')) die; if (' . (time() + $ttl) . ' < time()) $expired = true; else{$expired = false; $value = \'' . addcslashes($value, '\\\'') . '\';}' . '?' . '>');
                @flock($fp, LOCK_UN);
                fclose($fp);
            }
        }
    }
    if (isset($db_show_debug) && $db_show_debug === true) {
        $cache_hits[$cache_count]['t'] = array_sum(explode(' ', microtime())) - array_sum(explode(' ', $st));
    }
}
 function pmxCachePut($key, $value, $ttl, $useMember = false, $cleaner = null)
 {
     global $PortaMx_cache, $user_info;
     $st = microtime(true);
     if ($value === null && $cleaner !== null && $useMember) {
         $ckey = $PortaMx_cache['key'] . '-' . $cleaner . '-' . $key;
     } else {
         $ckey = $PortaMx_cache['key'] . ($useMember ? '-' . implode('_', $user_info['groups']) : '') . '-' . $key;
     }
     if (function_exists('zend_shm_cache_store')) {
         zend_shm_cache_store('PMX::' . $ckey, $value, $ttl);
     } elseif (function_exists('output_cache_put')) {
         output_cache_put($ckey, $value);
     }
     if ($value !== null) {
         $PortaMx_cache['vals']['saved'] += strlen($value);
     }
     $PortaMx_cache['vals']['time'] += microtime(true) - $st;
     // handle member groups key?
     if ($useMember && $cleaner === null) {
         pmxCacheMemGroupAcs();
     }
 }
 /**
  * Save some string datas into a cache record
  *
  * Note : $data is always "string" (serialization is done by the
  * core not by the backend)
  *
  * @param string $data data to cache
  * @param string $id cache id
  * @param array $tags array of strings, the cache record will be tagged by each string entry
  * *                  This option is not supported in this backend
  * @return boolean true if no problem
  */
 public function save($data, $id, $tags = array())
 {
     $result = output_cache_put($id, $data);
     if (count($tags) > 0) {
         foreach ($tags as $tag) {
             $tagid = self::TAGS_PREFIX . $tag;
             $old_tags = output_cache_get($tagid, $this->_directives['lifeTime']);
             if (!$old_tags) {
                 $old_tags = array();
             }
             $old_tags[$id] = 1;
             output_cache_put($tagid, $old_tags);
         }
         /*            if ($this->_directives['logging']) {
                         Zend_Log::log("Zend_Cache_Backend_ZendPlatform::save() : tags are unsupported by the Zend Platform backend", Zend_Log::LEVEL_WARNING);
         		}*/
     }
     return $result;
 }
/**
 * Put a value in the cache under a key
 *
 * @param String $key -- Global namespace cache.  Key for the data.
 * @param Serializable $value -- The value to store in the cache.
 */
function sugar_cache_put($key, $value)
{
    if (!$GLOBALS['external_cache_checked']) {
        check_cache();
    }
    if (EXTERNAL_CACHE_DEBUG) {
        echo "<HR>1 Adding key to APC cache {$key} with value ({$value})<HR>";
    }
    if (empty($value)) {
        $value = EXTERNAL_CACHE_NULL_VALUE;
    }
    if (EXTERNAL_CACHE_DEBUG) {
        echo "<HR>2 Adding key to APC cache {$key} with value ({$value})<HR>";
    }
    $GLOBALS['cache_local_store'][$key] = $value;
    if ($GLOBALS['external_cache_enabled']) {
        $external_key = $GLOBALS['sugar_config']['unique_key'] . $key;
        if ($GLOBALS['external_cache_type'] == 'zend') {
            output_cache_put($external_key, $value);
        } elseif ($GLOBALS['external_cache_type'] == 'apc') {
            $test_time = EXTERNAL_CACHE_INTERVAL_SECONDS;
            $return = apc_store($external_key, $value, $test_time);
            if (EXTERNAL_CACHE_DEBUG) {
                echo "<HR>Adding key to APC cache {$external_key} with value ({$value}) to be stored for {$test_time} seconds<HR>";
            }
        }
    }
}