Issues (1061)

Sources/CacheAPI-memcache.php (2 issues)

Labels
Severity
1
<?php
2
3
/**
4
 * Simple Machines Forum (SMF)
5
 *
6
 * @package SMF
7
 * @author Simple Machines https://www.simplemachines.org
8
 * @copyright 2020 Simple Machines and individual contributors
9
 * @license https://www.simplemachines.org/about/smf/license.php BSD
10
 *
11
 * @version 2.1 RC2
12
 */
13
14
if (!defined('SMF'))
15
	die('Hacking attempt...');
16
17
/**
18
 * Our Cache API class
19
 *
20
 * @package cacheAPI
21
 */
22
class memcache_cache extends cache_api
23
{
24
	/**
25
	 * @var \Memcache The memcache instance.
26
	 */
27
	private $memcache = null;
28
29
	/**
30
	 * {@inheritDoc}
31
	 */
32
	public function isSupported($test = false)
33
	{
34
		global $cache_memcached;
35
36
		$supported = class_exists('Memcache');
37
38
		if ($test)
39
			return $supported;
40
		return parent::isSupported() && $supported && !empty($cache_memcached);
41
	}
42
43
	/**
44
	 * {@inheritDoc}
45
	 */
46
	public function connect()
47
	{
48
		global $db_persist, $cache_memcached;
49
50
		$servers = explode(',', $cache_memcached);
51
		$port = 0;
52
53
		// Don't try more times than we have servers!
54
		$connected = false;
55
		$level = 0;
56
57
		// We should keep trying if a server times out, but only for the amount of servers we have.
58
		while (!$connected && $level < count($servers))
59
		{
60
			++$level;
61
			$this->memcache = new Memcache();
62
			$server = trim($servers[array_rand($servers)]);
63
64
			// Normal host names do not contain slashes, while e.g. unix sockets do. Assume alternative transport pipe with port 0.
65
			if (strpos($server, '/') !== false)
66
				$host = $server;
67
			else
68
			{
69
				$server = explode(':', $server);
70
				$host = $server[0];
71
				$port = isset($server[1]) ? $server[1] : 11211;
72
			}
73
74
			// Don't wait too long: yes, we want the server, but we might be able to run the query faster!
75
			if (empty($db_persist))
76
				$connected = $this->memcache->connect($host, $port);
0 ignored issues
show
It seems like $port can also be of type string; however, parameter $port of MemcachePool::connect() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

76
				$connected = $this->memcache->connect($host, /** @scrutinizer ignore-type */ $port);
Loading history...
77
			else
78
				$connected = $this->memcache->pconnect($host, $port);
0 ignored issues
show
It seems like $port can also be of type string; however, parameter $port of Memcache::pconnect() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

78
				$connected = $this->memcache->pconnect($host, /** @scrutinizer ignore-type */ $port);
Loading history...
79
		}
80
81
		return $connected;
82
	}
83
84
	/**
85
	 * {@inheritDoc}
86
	 */
87
	public function getData($key, $ttl = null)
88
	{
89
		$key = $this->prefix . strtr($key, ':/', '-_');
90
91
		$value = $this->memcache->get($key);
92
93
		// $value should return either data or false (from failure, key not found or empty array).
94
		if ($value === false)
95
			return null;
96
		return $value;
97
	}
98
99
	/**
100
	 * {@inheritDoc}
101
	 */
102
	public function putData($key, $value, $ttl = null)
103
	{
104
		$key = $this->prefix . strtr($key, ':/', '-_');
105
106
		return $this->memcache->set($key, $value, 0, $ttl !== null ? $ttl : $this->ttl);
107
	}
108
109
	/**
110
	 * {@inheritDoc}
111
	 */
112
	public function quit()
113
	{
114
		return $this->memcache->close();
115
	}
116
117
	/**
118
	 * {@inheritDoc}
119
	 */
120
	public function cleanCache($type = '')
121
	{
122
		$this->invalidateCache();
123
		return $this->memcache->flush();
124
	}
125
126
	/**
127
	 * {@inheritDoc}
128
	 */
129
	public function cacheSettings(array &$config_vars)
130
	{
131
		global $context, $txt;
132
133
		$config_vars[] = $txt['cache_memcache_settings'];
134
		$config_vars[] = array('cache_memcached', $txt['cache_memcache_servers'], 'file', 'text', 0, 'cache_memcached', 'postinput' => '<br><div class="smalltext"><em>' . $txt['cache_memcache_servers_subtext'] . '</em></div>');
135
136
		if (!isset($context['settings_post_javascript']))
137
			$context['settings_post_javascript'] = '';
138
139
		$context['settings_post_javascript'] .= '
140
			$("#cache_accelerator").change(function (e) {
141
				var cache_type = e.currentTarget.value;
142
				$("#cache_memcached").prop("disabled", cache_type != "memcache");
143
			});';
144
	}
145
146
	/**
147
	 * {@inheritDoc}
148
	 */
149
	public function getVersion()
150
	{
151
		return $this->memcache->getVersion();
152
	}
153
}
154
155
?>