123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- <?php
- defined('GNUSOCIAL') || die();
- class MemcachedPlugin extends Plugin
- {
- const PLUGIN_VERSION = '2.1.0';
- public static $cacheInitialized = false;
- public $servers = ['127.0.0.1'];
- public $defaultExpiry = 86400;
- protected $persistent = null;
- private $_conn = null;
-
- public function onInitializePlugin(): bool
- {
- if (self::$cacheInitialized) {
- $this->persistent = true;
- } else {
-
-
-
-
-
-
-
-
- $this->persistent = (php_sapi_name() == 'cli') ? false : true;
- }
- try {
- $this->_ensureConn();
- self::$cacheInitialized = true;
- } catch (MemcachedException $e) {
- common_log(LOG_ERR, 'Memcached encountered exception ' . get_class($e) . ': ' . $e->getMessage());
- }
- return true;
- }
-
- public function onStartCacheGet(&$key, &$value): bool
- {
- try {
- $this->_ensureConn();
- $value = $this->_conn->get($key);
- } catch (MemcachedException $e) {
- common_log(LOG_ERR, 'Memcached encountered exception ' . get_class($e) . ': ' . $e->getMessage());
- return true;
- }
- if ($value === false) {
-
- return $this->_conn->getResultCode() === Memcached::RES_NOTFOUND;
- } else {
- return false;
- }
- }
-
- public function onStartCacheSet(&$key, &$value, &$flag, &$expiry, &$success): bool
- {
- if ($expiry === null) {
- $expiry = $this->defaultExpiry;
- }
- try {
- $this->_ensureConn();
- if (!empty($flag)) {
- $this->_conn->setOption(Memcached::OPT_COMPRESSION, $flag);
- }
- $success = $this->_conn->set($key, $value, $expiry);
- } catch (MemcachedException $e) {
- common_log(LOG_ERR, 'Memcached encountered exception ' . get_class($e) . ': ' . $e->getMessage());
- return true;
- }
- return !$success;
- }
-
- public function onStartCacheIncrement(&$key, &$step, &$value): bool
- {
- try {
- $this->_ensureConn();
- $value = $this->_conn->increment($key, $step);
- } catch (MemcachedException $e) {
- common_log(LOG_ERR, 'Memcached encountered exception ' . get_class($e) . ': ' . $e->getMessage());
- return true;
- }
- if ($value === false) {
-
- return $this->_conn->getResultCode() === Memcached::RES_NOTFOUND;
- } else {
- return false;
- }
- }
-
- public function onStartCacheDelete(&$key, &$success): bool
- {
- try {
- $this->_ensureConn();
- $success = $this->_conn->delete($key);
- } catch (MemcachedException $e) {
- common_log(LOG_ERR, 'Memcached encountered exception ' . get_class($e) . ': ' . $e->getMessage());
- return true;
- }
- return !$success;
- }
-
- public function onStartCacheReconnect(&$success): bool
- {
- if (empty($this->_conn)) {
-
- return true;
- }
- if ($this->persistent) {
- common_log(LOG_ERR, "Cannot close persistent memcached connection");
- $success = false;
- } else {
- common_log(LOG_INFO, "Closing memcached connection");
- $success = $this->_conn->quit();
- $this->_conn = null;
- }
- return false;
- }
-
- private function _ensureConn(): void
- {
- if (empty($this->_conn)) {
- if ($this->persistent) {
- $this->_conn = new Memcached(
- 'gnusocial:' . common_config('site', 'nickname')
- );
- } else {
- $this->_conn = new Memcached();
- }
- if (!count($this->_conn->getServerList())) {
- if (is_array($this->servers)) {
- $servers = $this->servers;
- } else {
- $servers = [$this->servers];
- }
- foreach ($servers as $server) {
- if (is_array($server) && count($server) === 2) {
- list($host, $port) = $server;
- } else {
- $host = is_array($server) ? $server[0] : $server;
- $port = 11211;
- }
- $this->_conn->addServer($host, $port);
- }
-
-
-
- $this->_conn->setOption(Memcached::OPT_COMPRESSION, true);
- }
- }
- }
-
- protected function flag(int $flag): int
- {
- $out = 0;
- if ($flag & Cache::COMPRESSED == Cache::COMPRESSED) {
- $out |= Memcached::OPT_COMPRESSION;
- }
- return $out;
- }
- public function onPluginVersion(array &$versions): bool
- {
- $versions[] = array('name' => 'Memcached',
- 'version' => self::PLUGIN_VERSION,
- 'author' => 'Evan Prodromou, Craig Andrews',
- 'homepage' => GNUSOCIAL_ENGINE_REPO_URL . 'tree/master/plugins/Memcached',
- 'rawdescription' =>
-
- _m('Use <a href="http://memcached.org/">Memcached</a> to cache query results.'));
- return true;
- }
- }
|