Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
PageCache.php
Go to the documentation of this file.
1 <?php
8 
16 
21 {
23  const CONFIG_VALUE_PAGE_CACHE_REDIS = 'Cm_Cache_Backend_Redis';
24 
25  const INPUT_KEY_PAGE_CACHE_BACKEND = 'page-cache';
26  const INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_SERVER = 'page-cache-redis-server';
27  const INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_DATABASE = 'page-cache-redis-db';
28  const INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PORT = 'page-cache-redis-port';
29  const INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_COMPRESS_DATA = 'page-cache-redis-compress-data';
30  const INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PASSWORD = 'page-cache-redis-password';
31 
32  const CONFIG_PATH_PAGE_CACHE_BACKEND = 'cache/frontend/page_cache/backend';
33  const CONFIG_PATH_PAGE_CACHE_BACKEND_SERVER = 'cache/frontend/page_cache/backend_options/server';
34  const CONFIG_PATH_PAGE_CACHE_BACKEND_DATABASE = 'cache/frontend/page_cache/backend_options/database';
35  const CONFIG_PATH_PAGE_CACHE_BACKEND_PORT = 'cache/frontend/page_cache/backend_options/port';
36  const CONFIG_PATH_PAGE_CACHE_BACKEND_COMPRESS_DATA = 'cache/frontend/page_cache/backend_options/compress_data';
37  const CONFIG_PATH_PAGE_CACHE_BACKEND_PASSWORD = 'cache/frontend/page_cache/backend_options/password';
38 
42  private $defaultConfigValues = [
43  self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_SERVER => '127.0.0.1',
44  self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_DATABASE => '1',
45  self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PORT => '6379',
46  self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_COMPRESS_DATA => '0',
47  self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PASSWORD => ''
48  ];
49 
53  private $validPageCacheOptions = [
55  ];
56 
60  private $inputKeyToConfigPathMap = [
61  self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_SERVER => self::CONFIG_PATH_PAGE_CACHE_BACKEND_SERVER,
62  self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_DATABASE => self::CONFIG_PATH_PAGE_CACHE_BACKEND_DATABASE,
63  self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PORT => self::CONFIG_PATH_PAGE_CACHE_BACKEND_PORT,
64  self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_COMPRESS_DATA => self::CONFIG_PATH_PAGE_CACHE_BACKEND_COMPRESS_DATA,
65  self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PASSWORD => self::CONFIG_PATH_PAGE_CACHE_BACKEND_PASSWORD
66  ];
67 
71  private $redisValidator;
72 
78  public function __construct(RedisConnectionValidator $redisValidator)
79  {
80  $this->redisValidator = $redisValidator;
81  }
82 
86  public function getOptions()
87  {
88  return [
90  self::INPUT_KEY_PAGE_CACHE_BACKEND,
92  $this->validPageCacheOptions,
93  self::CONFIG_PATH_PAGE_CACHE_BACKEND,
94  'Default cache handler'
95  ),
96  new TextConfigOption(
97  self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_SERVER,
99  self::CONFIG_PATH_PAGE_CACHE_BACKEND_SERVER,
100  'Redis server'
101  ),
102  new TextConfigOption(
103  self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_DATABASE,
105  self::CONFIG_PATH_PAGE_CACHE_BACKEND_DATABASE,
106  'Database number for the cache'
107  ),
108  new TextConfigOption(
109  self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PORT,
111  self::CONFIG_PATH_PAGE_CACHE_BACKEND_PORT,
112  'Redis server listen port'
113  ),
114  new TextConfigOption(
115  self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_COMPRESS_DATA,
117  self::CONFIG_PATH_PAGE_CACHE_BACKEND_COMPRESS_DATA,
118  'Set to 1 to compress the full page cache (use 0 to disable)'
119  ),
120  new TextConfigOption(
121  self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PASSWORD,
123  self::CONFIG_PATH_PAGE_CACHE_BACKEND_PASSWORD,
124  'Redis server password'
125  )
126  ];
127  }
128 
133  {
135 
136  if (isset($options[self::INPUT_KEY_PAGE_CACHE_BACKEND])) {
137  if ($options[self::INPUT_KEY_PAGE_CACHE_BACKEND] == self::INPUT_VALUE_PAGE_CACHE_REDIS) {
138  $configData->set(self::CONFIG_PATH_PAGE_CACHE_BACKEND, self::CONFIG_VALUE_PAGE_CACHE_REDIS);
139  $this->setDefaultRedisConfig($deploymentConfig, $configData);
140  } else {
141  $configData->set(self::CONFIG_PATH_PAGE_CACHE_BACKEND, $options[self::INPUT_KEY_PAGE_CACHE_BACKEND]);
142  }
143  }
144 
145  foreach ($this->inputKeyToConfigPathMap as $inputKey => $configPath) {
146  if (isset($options[$inputKey])) {
147  $configData->set($configPath, $options[$inputKey]);
148  }
149  }
150 
151  return $configData;
152  }
153 
158  {
159  $errors = [];
160 
162  if (isset($options[self::INPUT_KEY_PAGE_CACHE_BACKEND])) {
163  if ($options[self::INPUT_KEY_PAGE_CACHE_BACKEND] == self::INPUT_VALUE_PAGE_CACHE_REDIS) {
164  if (!$this->validateRedisConfig($options, $deploymentConfig)) {
165  $errors[] = 'Invalid Redis configuration. Could not connect to Redis server.';
166  }
167  }
168  } elseif ($currentCacheBackend == self::CONFIG_VALUE_PAGE_CACHE_REDIS) {
169  if (!$this->validateRedisConfig($options, $deploymentConfig)) {
170  $errors[] = 'Invalid Redis configuration. Could not connect to Redis server.';
171  }
172  }
173 
174  if (isset($options[self::INPUT_KEY_PAGE_CACHE_BACKEND])
175  && !in_array($options[self::INPUT_KEY_PAGE_CACHE_BACKEND], $this->validPageCacheOptions)
176  ) {
177  $errors[] = "Invalid cache handler '{$options[self::INPUT_KEY_PAGE_CACHE_BACKEND]}'";
178  }
179 
180  return $errors;
181  }
182 
190  private function validateRedisConfig(array $options, DeploymentConfig $deploymentConfig)
191  {
192  $config = [];
193 
194  $config['host'] = isset($options[self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_SERVER])
196  : $deploymentConfig->get(
197  self::CONFIG_PATH_PAGE_CACHE_BACKEND_SERVER,
198  $this->getDefaultConfigValue(self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_SERVER)
199  );
200 
201  $config['port'] = isset($options[self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PORT])
203  : $deploymentConfig->get(
204  self::CONFIG_PATH_PAGE_CACHE_BACKEND_PORT,
205  $this->getDefaultConfigValue(self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PORT)
206  );
207 
208  $config['db'] = isset($options[self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_DATABASE])
210  : $deploymentConfig->get(
211  self::CONFIG_PATH_PAGE_CACHE_BACKEND_DATABASE,
212  $this->getDefaultConfigValue(self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_DATABASE)
213  );
214 
215  $config['password'] = isset($options[self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PASSWORD])
217  : $deploymentConfig->get(
218  self::CONFIG_PATH_PAGE_CACHE_BACKEND_PASSWORD,
219  $this->getDefaultConfigValue(self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PASSWORD)
220  );
221 
222  return $this->redisValidator->isValidConnection($config);
223  }
224 
232  private function setDefaultRedisConfig(DeploymentConfig $deploymentConfig, ConfigData $configData)
233  {
234  foreach ($this->inputKeyToConfigPathMap as $inputKey => $configPath) {
235  $configData->set($configPath, $deploymentConfig->get($configPath, $this->getDefaultConfigValue($inputKey)));
236  }
237 
238  return $configData;
239  }
240 
247  private function getDefaultConfigValue($inputKey)
248  {
249  if (isset($this->defaultConfigValues[$inputKey])) {
250  return $this->defaultConfigValues[$inputKey];
251  } else {
252  return '';
253  }
254  }
255 }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
$config
Definition: fraud_order.php:17
$deploymentConfig
__construct(RedisConnectionValidator $redisValidator)
Definition: PageCache.php:78
validate(array $options, DeploymentConfig $deploymentConfig)
Definition: PageCache.php:157
$errors
Definition: overview.phtml:9
createConfig(array $options, DeploymentConfig $deploymentConfig)
Definition: PageCache.php:132