X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FInProcessCache%2FInProcessCachePlugin.php;h=240b4e3188c938b7b85b9075411e65cefcaa7bcc;hb=f5aba994b2ca6dbe9d4dfd83d615d7bc3dcf2982;hp=1b6fbcdbea372f70e7521333349d350ddbe5c17b;hpb=99f3964394e18af6c139c5a1c804ced727e5b1a4;p=quix0rs-gnu-social.git diff --git a/plugins/InProcessCache/InProcessCachePlugin.php b/plugins/InProcessCache/InProcessCachePlugin.php index 1b6fbcdbea..240b4e3188 100644 --- a/plugins/InProcessCache/InProcessCachePlugin.php +++ b/plugins/InProcessCache/InProcessCachePlugin.php @@ -39,7 +39,7 @@ if (!defined('STATUSNET')) { * * 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. * @@ -53,15 +53,30 @@ if (!defined('STATUSNET')) { * @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 @@ -72,10 +87,9 @@ class InProcessCachePlugin extends Plugin * * @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]++; @@ -100,11 +114,10 @@ class InProcessCachePlugin extends Plugin * * @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; @@ -112,7 +125,7 @@ class InProcessCachePlugin extends Plugin /** * Called at the end of setting a cache element - * + * * Always set the cache element; may overwrite existing * data. * @@ -123,10 +136,11 @@ class InProcessCachePlugin extends Plugin * * @return boolean true */ - function onEndCacheSet($key, $value, $flag, $expiry) { - $this->_items[$key] = $value; + if ($this->active) { + $this->_items[$key] = $value; + } return true; } @@ -141,10 +155,9 @@ class InProcessCachePlugin extends Plugin * * @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; @@ -157,7 +170,6 @@ class InProcessCachePlugin extends Plugin * * @return boolean true */ - function onPluginVersion(&$versions) { $url = 'http://status.net/wiki/Plugin:InProcessCache'; @@ -167,6 +179,7 @@ class InProcessCachePlugin extends Plugin 'author' => 'Evan Prodromou', 'homepage' => $url, 'description' => + // TRANS: Plugin dscription. _m('Additional in-process cache for plugins.')); return true; } @@ -179,17 +192,16 @@ class InProcessCachePlugin extends Plugin * * @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;