PageRenderTime 41ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/setup/src/Magento/Setup/Model/ConfigOptionsList/Session.php

https://bitbucket.org/KholoshaMaxim/kms_someapi2
PHP | 355 lines | 281 code | 23 blank | 51 comment | 12 complexity | db87ac22c70dbab527adb374c7262d17 MD5 | raw file
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Setup\Model\ConfigOptionsList;
  7. use Magento\Framework\Setup\ConfigOptionsListInterface;
  8. use Magento\Framework\Config\ConfigOptionsListConstants;
  9. use Magento\Framework\App\DeploymentConfig;
  10. use Magento\Framework\Config\Data\ConfigData;
  11. use Magento\Framework\Config\File\ConfigFilePool;
  12. use Magento\Framework\Setup\Option\SelectConfigOption;
  13. use Magento\Framework\Setup\Option\TextConfigOption;
  14. /**
  15. * Deployment configuration options needed to configure session storage
  16. */
  17. class Session implements ConfigOptionsListInterface
  18. {
  19. const INPUT_KEY_SESSION_REDIS_HOST = 'session-save-redis-host';
  20. const INPUT_KEY_SESSION_REDIS_PORT = 'session-save-redis-port';
  21. const INPUT_KEY_SESSION_REDIS_PASSWORD = 'session-save-redis-password';
  22. const INPUT_KEY_SESSION_REDIS_TIMEOUT = 'session-save-redis-timeout';
  23. const INPUT_KEY_SESSION_REDIS_PERSISTENT_IDENTIFIER = 'session-save-redis-persistent-id';
  24. const INPUT_KEY_SESSION_REDIS_DATABASE = 'session-save-redis-db';
  25. const INPUT_KEY_SESSION_REDIS_COMPRESSION_THRESHOLD = 'session-save-redis-compression-threshold';
  26. const INPUT_KEY_SESSION_REDIS_COMPRESSION_LIBRARY = 'session-save-redis-compression-lib';
  27. const INPUT_KEY_SESSION_REDIS_LOG_LEVEL = 'session-save-redis-log-level';
  28. const INPUT_KEY_SESSION_REDIS_MAX_CONCURRENCY = 'session-save-redis-max-concurrency';
  29. const INPUT_KEY_SESSION_REDIS_BREAK_AFTER_FRONTEND = 'session-save-redis-break-after-frontend';
  30. const INPUT_KEY_SESSION_REDIS_BREAK_AFTER_ADMINHTML = 'session-save-redis-break-after-adminhtml';
  31. const INPUT_KEY_SESSION_REDIS_FIRST_LIFETIME = 'session-save-redis-first-lifetime';
  32. const INPUT_KEY_SESSION_REDIS_BOT_FIRST_LIFETIME = 'session-save-redis-bot-first-lifetime';
  33. const INPUT_KEY_SESSION_REDIS_BOT_LIFETIME = 'session-save-redis-bot-lifetime';
  34. const INPUT_KEY_SESSION_REDIS_DISABLE_LOCKING = 'session-save-redis-disable-locking';
  35. const INPUT_KEY_SESSION_REDIS_MIN_LIFETIME = 'session-save-redis-min-lifetime';
  36. const INPUT_KEY_SESSION_REDIS_MAX_LIFETIME = 'session-save-redis-max-lifetime';
  37. const CONFIG_PATH_SESSION_REDIS = 'session/redis';
  38. const CONFIG_PATH_SESSION_REDIS_HOST = 'session/redis/host';
  39. const CONFIG_PATH_SESSION_REDIS_PORT = 'session/redis/port';
  40. const CONFIG_PATH_SESSION_REDIS_PASSWORD = 'session/redis/password';
  41. const CONFIG_PATH_SESSION_REDIS_TIMEOUT = 'session/redis/timeout';
  42. const CONFIG_PATH_SESSION_REDIS_PERSISTENT_IDENTIFIER = 'session/redis/persistent_identifier';
  43. const CONFIG_PATH_SESSION_REDIS_DATABASE = 'session/redis/database';
  44. const CONFIG_PATH_SESSION_REDIS_COMPRESSION_THRESHOLD = 'session/redis/compression_threshold';
  45. const CONFIG_PATH_SESSION_REDIS_COMPRESSION_LIBRARY = 'session/redis/compression_library';
  46. const CONFIG_PATH_SESSION_REDIS_LOG_LEVEL = 'session/redis/log_level';
  47. const CONFIG_PATH_SESSION_REDIS_MAX_CONCURRENCY = 'session/redis/max_concurrency';
  48. const CONFIG_PATH_SESSION_REDIS_BREAK_AFTER_FRONTEND = 'session/redis/break_after_frontend';
  49. const CONFIG_PATH_SESSION_REDIS_BREAK_AFTER_ADMINHTML = 'session/redis/break_after_adminhtml';
  50. const CONFIG_PATH_SESSION_REDIS_FIRST_LIFETIME = 'session/redis/first_lifetime';
  51. const CONFIG_PATH_SESSION_REDIS_BOT_FIRST_LIFETIME = 'session/redis/bot_first_lifetime';
  52. const CONFIG_PATH_SESSION_REDIS_BOT_LIFETIME = 'session/redis/bot_lifetime';
  53. const CONFIG_PATH_SESSION_REDIS_DISABLE_LOCKING = 'session/redis/disable_locking';
  54. const CONFIG_PATH_SESSION_REDIS_MIN_LIFETIME = 'session/redis/min_lifetime';
  55. const CONFIG_PATH_SESSION_REDIS_MAX_LIFETIME = 'session/redis/max_lifetime';
  56. /**
  57. * @var array
  58. */
  59. private $defaultConfigValues = [
  60. ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE => ConfigOptionsListConstants::SESSION_SAVE_FILES,
  61. self::INPUT_KEY_SESSION_REDIS_HOST => '127.0.0.1',
  62. self::INPUT_KEY_SESSION_REDIS_PORT => '6379',
  63. self::INPUT_KEY_SESSION_REDIS_PASSWORD => '',
  64. self::INPUT_KEY_SESSION_REDIS_TIMEOUT => '2.5',
  65. self::INPUT_KEY_SESSION_REDIS_PERSISTENT_IDENTIFIER => '',
  66. self::INPUT_KEY_SESSION_REDIS_DATABASE => '2',
  67. self::INPUT_KEY_SESSION_REDIS_COMPRESSION_THRESHOLD => '2048',
  68. self::INPUT_KEY_SESSION_REDIS_COMPRESSION_LIBRARY => 'gzip',
  69. self::INPUT_KEY_SESSION_REDIS_LOG_LEVEL => '1',
  70. self::INPUT_KEY_SESSION_REDIS_MAX_CONCURRENCY => '6',
  71. self::INPUT_KEY_SESSION_REDIS_BREAK_AFTER_FRONTEND => '5',
  72. self::INPUT_KEY_SESSION_REDIS_BREAK_AFTER_ADMINHTML => '30',
  73. self::INPUT_KEY_SESSION_REDIS_FIRST_LIFETIME => '600',
  74. self::INPUT_KEY_SESSION_REDIS_BOT_FIRST_LIFETIME => '60',
  75. self::INPUT_KEY_SESSION_REDIS_BOT_LIFETIME => '7200',
  76. self::INPUT_KEY_SESSION_REDIS_DISABLE_LOCKING => '0',
  77. self::INPUT_KEY_SESSION_REDIS_MIN_LIFETIME => '60',
  78. self::INPUT_KEY_SESSION_REDIS_MAX_LIFETIME => '2592000'
  79. ];
  80. /**
  81. * @var array
  82. */
  83. private $validSaveHandlers = [
  84. ConfigOptionsListConstants::SESSION_SAVE_FILES,
  85. ConfigOptionsListConstants::SESSION_SAVE_DB,
  86. ConfigOptionsListConstants::SESSION_SAVE_REDIS
  87. ];
  88. /**
  89. * @var array
  90. */
  91. private $validCompressionLibraries = ['gzip', 'lzf', 'lz4', 'snappy'];
  92. /**
  93. * Associates input keys with config paths for Redis settings
  94. *
  95. * @var array
  96. */
  97. private $redisInputKeyToConfigPathMap = [
  98. self::INPUT_KEY_SESSION_REDIS_HOST => self::CONFIG_PATH_SESSION_REDIS_HOST,
  99. self::INPUT_KEY_SESSION_REDIS_PORT => self::CONFIG_PATH_SESSION_REDIS_PORT,
  100. self::INPUT_KEY_SESSION_REDIS_PASSWORD => self::CONFIG_PATH_SESSION_REDIS_PASSWORD,
  101. self::INPUT_KEY_SESSION_REDIS_TIMEOUT => self::CONFIG_PATH_SESSION_REDIS_TIMEOUT,
  102. self::INPUT_KEY_SESSION_REDIS_PERSISTENT_IDENTIFIER => self::CONFIG_PATH_SESSION_REDIS_PERSISTENT_IDENTIFIER,
  103. self::INPUT_KEY_SESSION_REDIS_DATABASE => self::CONFIG_PATH_SESSION_REDIS_DATABASE,
  104. self::INPUT_KEY_SESSION_REDIS_COMPRESSION_THRESHOLD => self::CONFIG_PATH_SESSION_REDIS_COMPRESSION_THRESHOLD,
  105. self::INPUT_KEY_SESSION_REDIS_COMPRESSION_LIBRARY => self::CONFIG_PATH_SESSION_REDIS_COMPRESSION_LIBRARY,
  106. self::INPUT_KEY_SESSION_REDIS_LOG_LEVEL => self::CONFIG_PATH_SESSION_REDIS_LOG_LEVEL,
  107. self::INPUT_KEY_SESSION_REDIS_MAX_CONCURRENCY => self::CONFIG_PATH_SESSION_REDIS_MAX_CONCURRENCY,
  108. self::INPUT_KEY_SESSION_REDIS_BREAK_AFTER_FRONTEND => self::CONFIG_PATH_SESSION_REDIS_BREAK_AFTER_FRONTEND,
  109. self::INPUT_KEY_SESSION_REDIS_BREAK_AFTER_ADMINHTML => self::CONFIG_PATH_SESSION_REDIS_BREAK_AFTER_ADMINHTML,
  110. self::INPUT_KEY_SESSION_REDIS_FIRST_LIFETIME => self::CONFIG_PATH_SESSION_REDIS_FIRST_LIFETIME,
  111. self::INPUT_KEY_SESSION_REDIS_BOT_FIRST_LIFETIME => self::CONFIG_PATH_SESSION_REDIS_BOT_FIRST_LIFETIME,
  112. self::INPUT_KEY_SESSION_REDIS_BOT_LIFETIME => self::CONFIG_PATH_SESSION_REDIS_BOT_LIFETIME,
  113. self::INPUT_KEY_SESSION_REDIS_DISABLE_LOCKING => self::CONFIG_PATH_SESSION_REDIS_DISABLE_LOCKING,
  114. self::INPUT_KEY_SESSION_REDIS_MIN_LIFETIME => self::CONFIG_PATH_SESSION_REDIS_MIN_LIFETIME,
  115. self::INPUT_KEY_SESSION_REDIS_MAX_LIFETIME => self::CONFIG_PATH_SESSION_REDIS_MAX_LIFETIME,
  116. ];
  117. /**
  118. * {@inheritdoc}
  119. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  120. */
  121. public function getOptions()
  122. {
  123. return [
  124. new SelectConfigOption(
  125. ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE,
  126. SelectConfigOption::FRONTEND_WIZARD_SELECT,
  127. $this->validSaveHandlers,
  128. ConfigOptionsListConstants::CONFIG_PATH_SESSION_SAVE,
  129. 'Session save handler',
  130. $this->getDefaultConfigValue(ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE)
  131. ),
  132. new TextConfigOption(
  133. self::INPUT_KEY_SESSION_REDIS_HOST,
  134. TextConfigOption::FRONTEND_WIZARD_TEXT,
  135. self::CONFIG_PATH_SESSION_REDIS_HOST,
  136. 'Fully qualified host name, IP address, or absolute path if using UNIX sockets'
  137. ),
  138. new TextConfigOption(
  139. self::INPUT_KEY_SESSION_REDIS_PORT,
  140. TextConfigOption::FRONTEND_WIZARD_TEXT,
  141. self::CONFIG_PATH_SESSION_REDIS_PORT,
  142. 'Redis server listen port'
  143. ),
  144. new TextConfigOption(
  145. self::INPUT_KEY_SESSION_REDIS_PASSWORD,
  146. TextConfigOption::FRONTEND_WIZARD_TEXT,
  147. self::CONFIG_PATH_SESSION_REDIS_PASSWORD,
  148. 'Redis server password'
  149. ),
  150. new TextConfigOption(
  151. self::INPUT_KEY_SESSION_REDIS_TIMEOUT,
  152. TextConfigOption::FRONTEND_WIZARD_TEXT,
  153. self::CONFIG_PATH_SESSION_REDIS_TIMEOUT,
  154. 'Connection timeout, in seconds'
  155. ),
  156. new TextConfigOption(
  157. self::INPUT_KEY_SESSION_REDIS_PERSISTENT_IDENTIFIER,
  158. TextConfigOption::FRONTEND_WIZARD_TEXT,
  159. self::CONFIG_PATH_SESSION_REDIS_PERSISTENT_IDENTIFIER,
  160. 'Unique string to enable persistent connections'
  161. ),
  162. new TextConfigOption(
  163. self::INPUT_KEY_SESSION_REDIS_DATABASE,
  164. TextConfigOption::FRONTEND_WIZARD_TEXT,
  165. self::CONFIG_PATH_SESSION_REDIS_DATABASE,
  166. 'Redis database number'
  167. ),
  168. new TextConfigOption(
  169. self::INPUT_KEY_SESSION_REDIS_COMPRESSION_THRESHOLD,
  170. TextConfigOption::FRONTEND_WIZARD_TEXT,
  171. self::CONFIG_PATH_SESSION_REDIS_COMPRESSION_THRESHOLD,
  172. 'Redis compression threshold'
  173. ),
  174. new TextConfigOption(
  175. self::INPUT_KEY_SESSION_REDIS_COMPRESSION_LIBRARY,
  176. TextConfigOption::FRONTEND_WIZARD_TEXT,
  177. self::CONFIG_PATH_SESSION_REDIS_COMPRESSION_LIBRARY,
  178. $this->getCompressionLibDescription()
  179. ),
  180. new TextConfigOption(
  181. self::INPUT_KEY_SESSION_REDIS_LOG_LEVEL,
  182. TextConfigOption::FRONTEND_WIZARD_TEXT,
  183. self::CONFIG_PATH_SESSION_REDIS_LOG_LEVEL,
  184. 'Redis log level. Values: 0 (least verbose) to 7 (most verbose)'
  185. ),
  186. new TextConfigOption(
  187. self::INPUT_KEY_SESSION_REDIS_MAX_CONCURRENCY,
  188. TextConfigOption::FRONTEND_WIZARD_TEXT,
  189. self::CONFIG_PATH_SESSION_REDIS_MAX_CONCURRENCY,
  190. 'Maximum number of processes that can wait for a lock on one session'
  191. ),
  192. new TextConfigOption(
  193. self::INPUT_KEY_SESSION_REDIS_BREAK_AFTER_FRONTEND,
  194. TextConfigOption::FRONTEND_WIZARD_TEXT,
  195. self::CONFIG_PATH_SESSION_REDIS_BREAK_AFTER_FRONTEND,
  196. 'Number of seconds to wait before trying to break a lock for frontend session'
  197. ),
  198. new TextConfigOption(
  199. self::INPUT_KEY_SESSION_REDIS_BREAK_AFTER_ADMINHTML,
  200. TextConfigOption::FRONTEND_WIZARD_TEXT,
  201. self::CONFIG_PATH_SESSION_REDIS_BREAK_AFTER_ADMINHTML,
  202. 'Number of seconds to wait before trying to break a lock for Admin session'
  203. ),
  204. new TextConfigOption(
  205. self::INPUT_KEY_SESSION_REDIS_FIRST_LIFETIME,
  206. TextConfigOption::FRONTEND_WIZARD_TEXT,
  207. self::CONFIG_PATH_SESSION_REDIS_FIRST_LIFETIME,
  208. 'Lifetime, in seconds, of session for non-bots on the first write (use 0 to disable)'
  209. ),
  210. new TextConfigOption(
  211. self::INPUT_KEY_SESSION_REDIS_BOT_FIRST_LIFETIME,
  212. TextConfigOption::FRONTEND_WIZARD_TEXT,
  213. self::CONFIG_PATH_SESSION_REDIS_BOT_FIRST_LIFETIME,
  214. 'Lifetime, in seconds, of session for bots on the first write (use 0 to disable)'
  215. ),
  216. new TextConfigOption(
  217. self::INPUT_KEY_SESSION_REDIS_BOT_LIFETIME,
  218. TextConfigOption::FRONTEND_WIZARD_TEXT,
  219. self::CONFIG_PATH_SESSION_REDIS_BOT_LIFETIME,
  220. 'Lifetime of session for bots on subsequent writes (use 0 to disable)'
  221. ),
  222. new TextConfigOption(
  223. self::INPUT_KEY_SESSION_REDIS_DISABLE_LOCKING,
  224. TextConfigOption::FRONTEND_WIZARD_TEXT,
  225. self::CONFIG_PATH_SESSION_REDIS_DISABLE_LOCKING,
  226. 'Redis disable locking. Values: false (default), true'
  227. ),
  228. new TextConfigOption(
  229. self::INPUT_KEY_SESSION_REDIS_MIN_LIFETIME,
  230. TextConfigOption::FRONTEND_WIZARD_TEXT,
  231. self::CONFIG_PATH_SESSION_REDIS_MIN_LIFETIME,
  232. 'Redis min session lifetime, in seconds'
  233. ),
  234. new TextConfigOption(
  235. self::INPUT_KEY_SESSION_REDIS_MAX_LIFETIME,
  236. TextConfigOption::FRONTEND_WIZARD_TEXT,
  237. self::CONFIG_PATH_SESSION_REDIS_MAX_LIFETIME,
  238. 'Redis max session lifetime, in seconds'
  239. ),
  240. ];
  241. }
  242. /**
  243. * {@inheritdoc}
  244. */
  245. public function createConfig(array $options, DeploymentConfig $deploymentConfig)
  246. {
  247. $configData = new ConfigData(ConfigFilePool::APP_ENV);
  248. //Set session-save option
  249. if (isset($options[ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE])) {
  250. $configData->set(
  251. ConfigOptionsListConstants::CONFIG_PATH_SESSION_SAVE,
  252. $options[ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE]
  253. );
  254. if ($options[ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE]
  255. == ConfigOptionsListConstants::SESSION_SAVE_REDIS
  256. ) {
  257. $this->setDefaultRedisConfig($deploymentConfig, $configData);
  258. }
  259. }
  260. //Set all Redis options that are specified
  261. foreach ($this->redisInputKeyToConfigPathMap as $inputKey => $configPath) {
  262. if (isset($options[$inputKey])) {
  263. $configData->set($configPath, $options[$inputKey]);
  264. }
  265. }
  266. return $configData;
  267. }
  268. /**
  269. * {@inheritdoc}
  270. */
  271. public function validate(array $options, DeploymentConfig $deploymentConfig)
  272. {
  273. $errors = [];
  274. if (isset($options[ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE])
  275. && !in_array($options[ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE], $this->validSaveHandlers)
  276. ) {
  277. $errors[] = "Invalid session handler '{$options[ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE]}'";
  278. }
  279. if (isset($options[self::INPUT_KEY_SESSION_REDIS_COMPRESSION_LIBRARY])
  280. && !in_array($options[self::INPUT_KEY_SESSION_REDIS_COMPRESSION_LIBRARY], $this->validCompressionLibraries)
  281. ) {
  282. $errors[] = "Invalid Redis compression library "
  283. . "'{$options[self::INPUT_KEY_SESSION_REDIS_COMPRESSION_LIBRARY]}'";
  284. }
  285. if (isset($options[self::INPUT_KEY_SESSION_REDIS_LOG_LEVEL])) {
  286. $level = $options[self::INPUT_KEY_SESSION_REDIS_LOG_LEVEL];
  287. if (($level < 0) or ($level > 7)) {
  288. $errors[] = "Invalid Redis log level '{$level}'. Valid range is 0-7, inclusive.";
  289. }
  290. }
  291. return $errors;
  292. }
  293. /**
  294. * Set the session Redis config based on defaults
  295. *
  296. * @param DeploymentConfig $deploymentConfig
  297. * @param ConfigData $configData
  298. * @return ConfigData
  299. */
  300. private function setDefaultRedisConfig(DeploymentConfig $deploymentConfig, ConfigData $configData)
  301. {
  302. foreach ($this->redisInputKeyToConfigPathMap as $inputKey => $configPath) {
  303. $configData->set($configPath, $deploymentConfig->get($configPath, $this->getDefaultConfigValue($inputKey)));
  304. }
  305. return $configData;
  306. }
  307. /**
  308. * Get the default value for input key
  309. *
  310. * @param string $inputKey
  311. * @return string
  312. */
  313. private function getDefaultConfigValue($inputKey)
  314. {
  315. if (isset($this->defaultConfigValues[$inputKey])) {
  316. return $this->defaultConfigValues[$inputKey];
  317. } else {
  318. return '';
  319. }
  320. }
  321. /**
  322. * Format the description for compression lib option
  323. *
  324. * @return string
  325. */
  326. private function getCompressionLibDescription()
  327. {
  328. $default = $this->getDefaultConfigValue(self::INPUT_KEY_SESSION_REDIS_COMPRESSION_LIBRARY);
  329. $otherLibs = array_diff($this->validCompressionLibraries, [$default]);
  330. return 'Redis compression library. Values: ' . $default . ' (default), ' . implode(', ', $otherLibs);
  331. }
  332. }