64 $severity = ReportStatus::OK;
66 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
'sys_refindex');
67 $count = $queryBuilder
69 ->from(
'sys_refindex')
73 $registry = GeneralUtility::makeInstance(Registry::class);
74 $lastRefIndexUpdate = $registry->get(
'core',
'sys_refindex_lastUpdate');
76 $uriBuilder = GeneralUtility::makeInstance(\
TYPO3\CMS\Backend\Routing\UriBuilder::class);
77 if (!$count && $lastRefIndexUpdate) {
79 $severity = ReportStatus::WARNING;
80 $url = (string)$uriBuilder->buildUriFromRoute(
'system_dbint') .
'&id=0&SET[function]=refindex';
81 $message = sprintf($this->
getLanguageService()->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:warning.backend_reference_index'),
'<a href="' . htmlspecialchars($url) .
'">',
'</a>',
BackendUtility::datetime($lastRefIndexUpdate));
83 return GeneralUtility::makeInstance(ReportStatus::class, $this->
getLanguageService()->getLL(
'status_referenceIndex'), $value, $message, $severity);
93 $memcachedUsed =
false;
95 if (!empty($memcachedServers)) {
96 $memcachedUsed =
true;
98 return $memcachedUsed;
108 $configurations =
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'caching'][
'cacheConfigurations'] ?? [];
109 $memcachedServers = [];
110 foreach ($configurations as $table => $conf) {
111 if (is_array($conf)) {
112 foreach ($conf as $key => $value) {
113 if ($value === \
TYPO3\CMS\Core\Cache\Backend\MemcachedBackend::class) {
114 $memcachedServers = $configurations[$table][
'options'][
'servers'];
120 return $memcachedServers;
132 $severity = ReportStatus::OK;
133 $failedConnections = [];
134 $defaultMemcachedPort = ini_get(
'memcache.default_port');
136 if (function_exists(
'memcache_connect') && is_array($memcachedServers)) {
137 foreach ($memcachedServers as $testServer) {
138 $configuredServer = $testServer;
139 if (strpos($testServer,
'unix://') === 0) {
143 if (strpos($testServer,
'tcp://') === 0) {
144 $testServer = substr($testServer, 6);
146 if (strstr($testServer,
':') !==
false) {
147 list($host, $port) = explode(
':', $testServer, 2);
150 $port = $defaultMemcachedPort;
153 $memcachedConnection = @memcache_connect($host, $port);
154 if ($memcachedConnection !=
null) {
157 $failedConnections[] = $configuredServer;
161 if (!empty($failedConnections)) {
163 $severity = ReportStatus::WARNING;
164 $message = $this->
getLanguageService()->
sL(
'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:warning.memcache_not_usable') .
'<br /><br />' .
'<ul><li>' . implode(
'</li><li>', $failedConnections) .
'</li></ul>';
166 return GeneralUtility::makeInstance(ReportStatus::class, $this->
getLanguageService()->getLL(
'status_memcachedConfiguration'), $value, $message, $severity);
178 $severity = ReportStatus::OK;
179 if ((
int)
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'fileCreateMask'] % 10 & 2) {
180 $value =
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'fileCreateMask'];
181 $severity = ReportStatus::WARNING;
184 return GeneralUtility::makeInstance(ReportStatus::class, $this->
getLanguageService()->getLL(
'status_CreatedFilePermissions'), $value, $message, $severity);
196 $severity = ReportStatus::OK;
197 if ((
int)
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'folderCreateMask'] % 10 & 2) {
198 $value =
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'folderCreateMask'];
199 $severity = ReportStatus::WARNING;
202 return GeneralUtility::makeInstance(ReportStatus::class, $this->
getLanguageService()->getLL(
'status_CreatedDirectoryPermissions'), $value, $message, $severity);
212 $connection = GeneralUtility::makeInstance(ConnectionPool::class)
215 return strpos($connection->getServerVersion(),
'MySQL') === 0;
225 $connection = GeneralUtility::makeInstance(ConnectionPool::class)
228 $queryBuilder = $connection->createQueryBuilder();
229 $defaultDatabaseCharset = (string)$queryBuilder->select(
'DEFAULT_CHARACTER_SET_NAME')
230 ->from(
'information_schema.SCHEMATA')
232 $queryBuilder->expr()->eq(
234 $queryBuilder->createNamedParameter($connection->getDatabase(), \PDO::PARAM_STR)
241 $severity = ReportStatus::OK;
244 if (strpos($defaultDatabaseCharset,
'utf8') !== 0) {
247 $queryBuilder = $connection->createQueryBuilder();
248 $nonUtf8TableCollationsFound = $queryBuilder->select(
'table_collation')
249 ->from(
'information_schema.tables')
251 $queryBuilder->expr()->andX(
252 $queryBuilder->expr()->eq(
'table_schema', $queryBuilder->quote($connection->getDatabase())),
253 $queryBuilder->expr()->notLike(
'table_collation', $queryBuilder->quote(
'utf8%'))
259 if ($nonUtf8TableCollationsFound->rowCount() > 0) {
261 ->getLL(
'status_MysqlDatabaseCharacterSet_Unsupported'), $defaultDatabaseCharset);
262 $severity = ReportStatus::ERROR;
266 $severity = ReportStatus::INFO;
273 if (isset($tableOptions[
'collate'])) {
274 $collationConstraint = $queryBuilder->expr()->neq(
'table_collation', $queryBuilder->quote($tableOptions[
'collate']));
275 $charset = $tableOptions[
'collate'];
276 } elseif (isset($tableOptions[
'charset'])) {
277 $collationConstraint = $queryBuilder->expr()->notLike(
'table_collation', $queryBuilder->quote($tableOptions[
'charset'] .
'%'));
278 $charset = $tableOptions[
'charset'];
281 if (isset($collationConstraint)) {
282 $queryBuilder = $connection->createQueryBuilder();
283 $wrongCollationTablesFound = $queryBuilder->select(
'table_collation')
284 ->from(
'information_schema.tables')
286 $queryBuilder->expr()->andX(
287 $queryBuilder->expr()->eq(
'table_schema', $queryBuilder->quote($connection->getDatabase())),
294 if ($wrongCollationTablesFound->rowCount() > 0) {
295 $message = sprintf($this->
getLanguageService()->getLL(
'status_MysqlDatabaseCharacterSet_MixedCollations'), $charset);
296 $severity = ReportStatus::ERROR;
299 if (isset($tableOptions[
'collate'])) {
300 $collationConstraint = $queryBuilder->expr()->neq(
'collation_name', $queryBuilder->quote($tableOptions[
'collate']));
301 } elseif (isset($tableOptions[
'charset'])) {
302 $collationConstraint = $queryBuilder->expr()->notLike(
'collation_name', $queryBuilder->quote($tableOptions[
'charset'] .
'%'));
305 $queryBuilder = $connection->createQueryBuilder();
306 $wrongCollationColumnsFound = $queryBuilder->select(
'collation_name')
307 ->from(
'information_schema.columns')
309 $queryBuilder->expr()->andX(
310 $queryBuilder->expr()->eq(
'table_schema', $queryBuilder->quote($connection->getDatabase())),
317 if ($wrongCollationColumnsFound->rowCount() > 0) {
318 $message = sprintf($this->
getLanguageService()->getLL(
'status_MysqlDatabaseCharacterSet_MixedCollations'), $charset);
319 $severity = ReportStatus::ERROR;
328 return GeneralUtility::makeInstance(