Browse Source

Adds a setup check for the memory limit

Signed-off-by: Michael Weimann <mail@michael-weimann.eu>
Michael Weimann 5 years ago
parent
commit
c2fced4463
3 changed files with 74 additions and 2 deletions
  1. 9 0
      core/js/setupchecks.js
  2. 47 0
      lib/private/MemoryInfo.php
  3. 18 2
      settings/Controller/CheckSetupController.php

+ 9 - 0
core/js/setupchecks.js

@@ -316,6 +316,15 @@
 							type: OC.SetupChecks.MESSAGE_TYPE_WARNING
 						});
 					}
+					if (!data.isTheMemoryLimitHighEnough) {
+						messages.push({
+							msg: t(
+								'core',
+								'The PHP memory limit is below the recommended value of 512MB.'
+							),
+							type: OC.SetupChecks.MESSAGE_TYPE_WARNING
+						})
+					}
 				} else {
 					messages.push({
 						msg: t('core', 'Error occurred while checking server setup'),

+ 47 - 0
lib/private/MemoryInfo.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace OC;
+
+/**
+ * Helper class that covers memory info.
+ */
+class MemoryInfo {
+	/**
+	 * Returns the php memory limit.
+	 *
+	 * @return int The memory limit in bytes.
+	 */
+	public function getMemoryLimit(): int {
+		$iniValue = trim(ini_get('memory_limit'));
+		if ($iniValue === '-1') {
+			return -1;
+		} else if (is_numeric($iniValue) === true) {
+			return (int)$iniValue;
+		} else {
+			return $this->memoryLimitToBytes($iniValue);
+		}
+	}
+
+	/**
+	 * Converts the ini memory limit to bytes.
+	 *
+	 * @param string $memoryLimit The "memory_limit" ini value
+	 * @return int
+	 */
+	private function memoryLimitToBytes(string $memoryLimit): int {
+		$last = strtolower(substr($memoryLimit, -1));
+		$memoryLimit = (int)substr($memoryLimit, 0, -1);
+
+		// intended fall trough
+		switch($last) {
+			case 'g':
+				$memoryLimit *= 1024;
+			case 'm':
+				$memoryLimit *= 1024;
+			case 'k':
+				$memoryLimit *= 1024;
+		}
+
+		return $memoryLimit;
+	}
+}

+ 18 - 2
settings/Controller/CheckSetupController.php

@@ -39,6 +39,7 @@ use OC\DB\Connection;
 use OC\DB\MissingIndexInformation;
 use OC\IntegrityCheck\Checker;
 use OC\Lock\NoopLockingProvider;
+use OC\MemoryInfo;
 use OCP\AppFramework\Controller;
 use OCP\AppFramework\Http\DataDisplayResponse;
 use OCP\AppFramework\Http\DataResponse;
@@ -81,6 +82,8 @@ class CheckSetupController extends Controller {
 	private $lockingProvider;
 	/** @var IDateTimeFormatter */
 	private $dateTimeFormatter;
+	/** @var MemoryInfo */
+	private $memoryInfo;
 
 	public function __construct($AppName,
 								IRequest $request,
@@ -94,7 +97,8 @@ class CheckSetupController extends Controller {
 								EventDispatcherInterface $dispatcher,
 								IDBConnection $db,
 								ILockingProvider $lockingProvider,
-								IDateTimeFormatter $dateTimeFormatter) {
+								IDateTimeFormatter $dateTimeFormatter,
+								MemoryInfo $memoryInfo) {
 		parent::__construct($AppName, $request);
 		$this->config = $config;
 		$this->clientService = $clientService;
@@ -107,6 +111,7 @@ class CheckSetupController extends Controller {
 		$this->db = $db;
 		$this->lockingProvider = $lockingProvider;
 		$this->dateTimeFormatter = $dateTimeFormatter;
+		$this->memoryInfo = $memoryInfo;
 	}
 
 	/**
@@ -529,6 +534,16 @@ Raw output
 		return function_exists('opcache_get_status');
 	}
 
+	/**
+	 * Tests if the php memory limit is high enough.
+	 *
+	 * @return bool True if more than 512 MB available, else false.
+	 */
+	protected function isTheMemoryLimitHighEnough(): bool {
+		$memoryLimit = $this->memoryInfo->getMemoryLimit();
+		return $memoryLimit === -1 || $memoryLimit >= 512 * 1024 * 1024;
+	}
+
 	/**
 	 * @return DataResponse
 	 */
@@ -565,7 +580,8 @@ Raw output
 				'isSqliteUsed' => $this->isSqliteUsed(),
 				'databaseConversionDocumentation' => $this->urlGenerator->linkToDocs('admin-db-conversion'),
 				'isPhpMailerUsed' => $this->isPhpMailerUsed(),
-				'mailSettingsDocumentation' => $this->urlGenerator->getAbsoluteURL('index.php/settings/admin')
+				'mailSettingsDocumentation' => $this->urlGenerator->getAbsoluteURL('index.php/settings/admin'),
+				'isTheMemoryLimitHighEnough' => $this->isTheMemoryLimitHighEnough(),
 			]
 		);
 	}