*
* This plugin adds an extra level of in-process caching to any regular
* cache system like APC, XCache, or Memcache.
- *
+ *
* Note that since most caching plugins return false for StartCache*
* methods, you should add this plugin before them, i.e.
*
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
-
class InProcessCachePlugin extends Plugin
{
private $_items = array();
private $_hits = array();
+ private $active;
+
+ /**
+ * Constructor checks if it's safe to use the in-process cache.
+ * On CLI scripts, we'll disable ourselves to avoid data corruption
+ * due to keeping stale data around.
+ *
+ * On web requests we'll roll the dice; they're short-lived so have
+ * less chance of stale data. Race conditions are still possible,
+ * so beware!
+ */
+ function __construct()
+ {
+ parent::__construct();
+ $this->active = (PHP_SAPI != 'cli');
+ }
/**
* Get an item from the cache
- *
+ *
* Called before other cache systems are called (iif this
* plugin was loaded correctly, see class comment). If we
* have the data, return it, and don't hit the other cache
*
* @return boolean false if found, else true
*/
-
function onStartCacheGet(&$key, &$value)
{
- if (array_key_exists($key, $this->_items)) {
+ if ($this->active && array_key_exists($key, $this->_items)) {
$value = $this->_items[$key];
if (array_key_exists($key, $this->_hits)) {
$this->_hits[$key]++;
*
* @return boolean hook value, true
*/
-
function onEndCacheGet($key, &$value)
{
- if (!array_key_exists($key, $this->_items) ||
- $this->_items[$key] != $value) {
+ if ($this->active && (!array_key_exists($key, $this->_items) ||
+ $this->_items[$key] != $value)) {
$this->_items[$key] = $value;
}
return true;
/**
* Called at the end of setting a cache element
- *
+ *
* Always set the cache element; may overwrite existing
* data.
*
*
* @return boolean true
*/
-
function onEndCacheSet($key, $value, $flag, $expiry)
{
- $this->_items[$key] = $value;
+ if ($this->active) {
+ $this->_items[$key] = $value;
+ }
return true;
}
*
* @return boolean true
*/
-
function onStartCacheDelete(&$key, &$success)
{
- if (array_key_exists($key, $this->_items)) {
+ if ($this->active && array_key_exists($key, $this->_items)) {
unset($this->_items[$key]);
}
return true;
*
* @return boolean true
*/
-
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
- $url = 'http://status.net/wiki/Plugin:InProcessCache';
+ $url = 'https://git.gnu.io/gnu/gnu-social/tree/master/plugins/InProcessCache';
$versions[] = array('name' => 'InProcessCache',
- 'version' => STATUSNET_VERSION,
+ 'version' => GNUSOCIAL_VERSION,
'author' => 'Evan Prodromou',
'homepage' => $url,
'description' =>
+ // TRANS: Plugin dscription.
_m('Additional in-process cache for plugins.'));
return true;
}
*
* @return boolean true
*/
-
function cleanup()
{
- if (common_config('inprocess', 'stats')) {
- $this->log(LOG_INFO, "cache size: " .
+ if ($this->active && common_config('inprocess', 'stats')) {
+ $this->log(LOG_INFO, "cache size: " .
count($this->_items));
$sum = 0;
foreach ($this->_hits as $hitcount) {
$sum += $hitcount;
}
- $this->log(LOG_INFO, $sum . " hits on " .
+ $this->log(LOG_INFO, $sum . " hits on " .
count($this->_hits) . " keys");
}
return true;