Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ReadinessCheck.php
Go to the documentation of this file.
1 <?php
7 
10 
16 {
20  const SETUP_CRON_JOB_STATUS_FILE = '.setup_cronjob_status';
21 
25  const KEY_READINESS_CHECKS = 'readiness_checks';
26  const KEY_PHP_CHECKS = 'php_checks';
27  const KEY_DB_WRITE_PERMISSION_VERIFIED = 'db_write_permission_verified';
28  const KEY_PHP_VERSION_VERIFIED = 'php_version_verified';
29  const KEY_PHP_SETTINGS_VERIFIED = 'php_settings_verified';
30  const KEY_PHP_EXTENSIONS_VERIFIED = 'php_extensions_verified';
31  const KEY_FILE_PATHS = 'file_paths';
32  const KEY_ERROR = 'error';
33  const KEY_LIST = 'list';
34  const KEY_CURRENT_TIMESTAMP = 'current_timestamp';
35  const KEY_LAST_TIMESTAMP = 'last_timestamp';
39  private $dbValidator;
40 
44  private $deploymentConfig;
45 
49  private $filesystem;
50 
54  private $phpReadinessCheck;
55 
59  private $basePackageInfo;
60 
64  private $status;
65 
76  public function __construct(
77  \Magento\Setup\Validator\DbValidator $dbValidator,
78  \Magento\Framework\App\DeploymentConfig $deploymentConfig,
79  \Magento\Framework\Filesystem $filesystem,
80  \Magento\Setup\Model\PhpReadinessCheck $phpReadinessCheck,
81  BasePackageInfo $basePackageInfo,
82  Status $status
83  ) {
84  $this->dbValidator = $dbValidator;
85  $this->deploymentConfig = $deploymentConfig;
86  $this->filesystem = $filesystem;
87  $this->phpReadinessCheck = $phpReadinessCheck;
88  $this->basePackageInfo = $basePackageInfo;
89  $this->status = $status;
90  }
91 
97  public function runReadinessCheck()
98  {
99  $resultJsonRawData = [self::KEY_READINESS_CHECKS => []];
100  $errorLogMessages = [];
101 
102  // check PHP version
103  $phpVersionCheckResult = $this->phpReadinessCheck->checkPhpVersion();
104  $errorMessage = $this->getPhpVersionCheckErrorLogMessage($phpVersionCheckResult);
105  if (!empty($errorMessage)) {
106  $errorLogMessages[] = $errorMessage;
107  }
108 
109  // check PHP extensions
110  $phpExtensionsCheckResult = $this->phpReadinessCheck->checkPhpExtensions();
111  $errorMessage = $this->getPhpExtensionsCheckErrorLogMessage($phpExtensionsCheckResult);
112  if (!empty($errorMessage)) {
113  $errorLogMessages[] = $errorMessage;
114  }
115 
116  // check PHP settings
117  $phpSettingsCheckResult = $this->phpReadinessCheck->checkPhpCronSettings();
118  $errorMessage = $this->getPhpSettingsCheckErrorLogMessage($phpSettingsCheckResult);
119  if (!empty($errorMessage)) {
120  $errorLogMessages[] = $errorMessage;
121  }
122 
123  $resultJsonRawData[self::KEY_PHP_CHECKS][self::KEY_PHP_VERSION_VERIFIED] = $phpVersionCheckResult;
124  $resultJsonRawData[self::KEY_PHP_CHECKS][self::KEY_PHP_EXTENSIONS_VERIFIED] = $phpExtensionsCheckResult;
125  $resultJsonRawData[self::KEY_PHP_CHECKS][self::KEY_PHP_SETTINGS_VERIFIED] = $phpSettingsCheckResult;
126 
127  // check DB connection
128  $errorMessage = $this->performDBCheck();
129  if (empty($errorMessage)) {
131  } else {
133  $resultJsonRawData[self::KEY_READINESS_CHECKS][self::KEY_ERROR] = $errorMessage;
134  $errorLogMessages[] = $errorMessage;
135  }
136 
137  // Prepare list of magento specific files and directory paths for updater application to check write
138  // permissions
139  $errorMessage = '';
140  try {
141  $filePaths = $this->basePackageInfo->getPaths();
142  $resultJsonRawData[self::KEY_FILE_PATHS][self::KEY_LIST] = $filePaths;
143  } catch (\Exception $e) {
144  $errorMessage = $e->getMessage();
145  $resultJsonRawData[self::KEY_FILE_PATHS][self::KEY_LIST] = [];
146  $errorLogMessages[] = $errorMessage;
147  }
148  $resultJsonRawData[self::KEY_FILE_PATHS][self::KEY_ERROR] = $errorMessage;
149 
150  // updates timestamp
151  $write = $this->filesystem->getDirectoryWrite(\Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR);
152  if ($write->isExist(self::SETUP_CRON_JOB_STATUS_FILE)) {
153  $jsonData = json_decode($write->readFile(self::SETUP_CRON_JOB_STATUS_FILE), true);
154  if (isset($jsonData[self::KEY_CURRENT_TIMESTAMP])) {
155  $resultJsonRawData[self::KEY_LAST_TIMESTAMP] = $jsonData[self::KEY_CURRENT_TIMESTAMP];
156  }
157  }
158  $resultJsonRawData[self::KEY_CURRENT_TIMESTAMP] = time();
159 
160  // write to transient log file to display on GUI
161  $resultJson = json_encode($resultJsonRawData, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
162  $write->writeFile(self::SETUP_CRON_JOB_STATUS_FILE, $resultJson);
163 
164  // write to permanent log file, var/log/update.log
165  foreach ($errorLogMessages as $errorLog) {
166  $this->status->add($errorLog, \Psr\Log\LogLevel::ERROR, false);
167  }
168  return (empty($errorLogMessages));
169  }
170 
177  private function getPhpVersionCheckErrorLogMessage($phpVersionCheckResult)
178  {
179  $message = '';
180  if (isset($phpVersionCheckResult['responseType']) &&
181  $phpVersionCheckResult['responseType'] == ResponseTypeInterface::RESPONSE_TYPE_ERROR) {
182  if (isset($phpVersionCheckResult['data']['message'])) {
183  $message = $phpVersionCheckResult['data']['message'];
184  } else {
185  $message = 'Minimum required version is' .
186  $phpVersionCheckResult['data']['required'] .
187  '. While your installed version is ' .
188  $phpVersionCheckResult['data']['current'] .
189  '.';
190  }
191  }
192  return $message;
193  }
194 
201  private function getPhpExtensionsCheckErrorLogMessage($phpExtensionsCheckResult)
202  {
203  $message = '';
204  if (isset($phpExtensionsCheckResult['responseType']) &&
205  $phpExtensionsCheckResult['responseType'] == ResponseTypeInterface::RESPONSE_TYPE_ERROR) {
206  if (isset($phpExtensionsCheckResult['data']['message'])) {
207  $message = $phpExtensionsCheckResult['data']['message'];
208  } else {
209  $message = 'Following required PHP extensions are missing:' .
210  PHP_EOL .
211  "\t" .
212  implode(PHP_EOL . "\t", $phpExtensionsCheckResult['data']['missing']);
213  }
214  }
215  return $message;
216  }
217 
224  private function getPhpSettingsCheckErrorLogMessage($phpSettingsCheckResult)
225  {
226  $messages = [];
227  if (isset($phpSettingsCheckResult['responseType']) &&
228  $phpSettingsCheckResult['responseType'] == ResponseTypeInterface::RESPONSE_TYPE_ERROR) {
229  foreach ($phpSettingsCheckResult['data'] as $valueArray) {
230  if ($valueArray['error'] == true) {
231  $messages[] = preg_replace('/\s+/S', " ", $valueArray['message']);
232  }
233  }
234  }
235  return implode(PHP_EOL . "\t", $messages);
236  }
237 
243  private function performDBCheck()
244  {
245  $errorLogMessage = '';
246  $dbInfo = $this->deploymentConfig->get(
248  );
249  try {
250  $this->dbValidator->checkDatabaseConnection(
251  $dbInfo[\Magento\Framework\Config\ConfigOptionsListConstants::KEY_NAME],
252  $dbInfo[\Magento\Framework\Config\ConfigOptionsListConstants::KEY_HOST],
253  $dbInfo[\Magento\Framework\Config\ConfigOptionsListConstants::KEY_USER],
254  $dbInfo[\Magento\Framework\Config\ConfigOptionsListConstants::KEY_PASSWORD]
255  );
256  } catch (\Exception $e) {
257  $errorLogMessage = $e->getMessage();
258  }
259  return $errorLogMessage;
260  }
261 }
$message
__construct(\Magento\Setup\Validator\DbValidator $dbValidator, \Magento\Framework\App\DeploymentConfig $deploymentConfig, \Magento\Framework\Filesystem $filesystem, \Magento\Setup\Model\PhpReadinessCheck $phpReadinessCheck, BasePackageInfo $basePackageInfo, Status $status)
$deploymentConfig
$status
Definition: order_status.php:8
$filesystem