Browse Source
Merge pull request #10539 from nextcloud/feature-8642-memory-check
Merge pull request #10539 from nextcloud/feature-8642-memory-check
Adds a setup and cli check for the recommended memory limitpull/4051/merge
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 314 additions and 4 deletions
-
8console.php
-
11core/js/setupchecks.js
-
58core/js/tests/specs/setupchecksSpec.js
-
1lib/composer/composer/autoload_classmap.php
-
1lib/composer/composer/autoload_static.php
-
19lib/private/Console/Application.php
-
81lib/private/MemoryInfo.php
-
8settings/Controller/CheckSetupController.php
-
13tests/Settings/Controller/CheckSetupControllerTest.php
-
118tests/lib/MemoryInfoTest.php
@ -0,0 +1,81 @@ |
|||
<?php |
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* @copyright Copyright (c) 2018, Michael Weimann (<mail@michael-weimann.eu>) |
|||
* |
|||
* @license GNU AGPL version 3 or any later version |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU Affero General Public License as |
|||
* published by the Free Software Foundation, either version 3 of the |
|||
* License, or (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU Affero General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Affero General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
* |
|||
*/ |
|||
|
|||
namespace OC; |
|||
|
|||
/** |
|||
* Helper class that covers memory info. |
|||
*/ |
|||
class MemoryInfo { |
|||
|
|||
const RECOMMENDED_MEMORY_LIMIT = 512 * 1024 * 1024; |
|||
|
|||
/** |
|||
* Tests if the memory limit is greater or equal the recommended value. |
|||
* |
|||
* @return bool |
|||
*/ |
|||
public function isMemoryLimitSufficient(): bool { |
|||
$memoryLimit = $this->getMemoryLimit(); |
|||
return $memoryLimit === -1 || $memoryLimit >= self::RECOMMENDED_MEMORY_LIMIT; |
|||
} |
|||
|
|||
/** |
|||
* 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; |
|||
} |
|||
} |
|||
@ -0,0 +1,118 @@ |
|||
<?php |
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* @copyright Copyright (c) 2018, Michael Weimann (<mail@michael-weimann.eu>) |
|||
* |
|||
* @license GNU AGPL version 3 or any later version |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU Affero General Public License as |
|||
* published by the Free Software Foundation, either version 3 of the |
|||
* License, or (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU Affero General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Affero General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
* |
|||
*/ |
|||
|
|||
namespace Test; |
|||
|
|||
use OC\MemoryInfo; |
|||
use PHPUnit\Framework\MockObject\MockObject; |
|||
|
|||
/** |
|||
* This class provides tests for the MemoryInfo class. |
|||
*/ |
|||
class MemoryInfoTest extends TestCase { |
|||
/** |
|||
* The "memory_limit" value before tests. |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $iniSettingBeforeTest; |
|||
|
|||
/** |
|||
* @beforeClass |
|||
*/ |
|||
public function backupMemoryInfoIniSetting() { |
|||
$this->iniSettingBeforeTest = ini_get('memory_limit'); |
|||
} |
|||
|
|||
/** |
|||
* @afterClass |
|||
*/ |
|||
public function restoreMemoryInfoIniSetting() { |
|||
ini_set('memory_limit', $this->iniSettingBeforeTest); |
|||
} |
|||
|
|||
/** |
|||
* Provides test data. |
|||
* |
|||
* @return array |
|||
*/ |
|||
public function getMemoryLimitTestData(): array { |
|||
return [ |
|||
'unlimited' => ['-1', -1,], |
|||
'0' => ['0', 0,], |
|||
'134217728 bytes' => ['134217728', 134217728,], |
|||
'128M' => ['128M', 134217728,], |
|||
'131072K' => ['131072K', 134217728,], |
|||
'2G' => ['2G', 2147483648,], |
|||
]; |
|||
} |
|||
|
|||
/** |
|||
* Tests that getMemoryLimit works as expected. |
|||
* |
|||
* @param string $iniValue The "memory_limit" ini data. |
|||
* @param int $expected The expected detected memory limit. |
|||
* @dataProvider getMemoryLimitTestData |
|||
*/ |
|||
public function testMemoryLimit($iniValue, int $expected) { |
|||
ini_set('memory_limit', $iniValue); |
|||
$memoryInfo = new MemoryInfo(); |
|||
self::assertEquals($expected, $memoryInfo->getMemoryLimit()); |
|||
} |
|||
|
|||
/** |
|||
* Provides sufficient memory limit test data. |
|||
* |
|||
* @return array |
|||
*/ |
|||
public function getSufficientMemoryTestData(): array { |
|||
return [ |
|||
'unlimited' => [-1, true,], |
|||
'512M' => [512 * 1024 * 1024, true,], |
|||
'1G' => [1024 * 1024 * 1024, true,], |
|||
'256M' => [256 * 1024 * 1024, false,], |
|||
]; |
|||
} |
|||
|
|||
/** |
|||
* Tests that isMemoryLimitSufficient returns the correct values. |
|||
* |
|||
* @param int $memoryLimit The memory limit |
|||
* @param bool $expected If the memory limit is sufficient. |
|||
* @dataProvider getSufficientMemoryTestData |
|||
* @return void |
|||
*/ |
|||
public function testIsMemoryLimitSufficient(int $memoryLimit, bool $expected) { |
|||
/* @var MemoryInfo|MockObject $memoryInfo */ |
|||
$memoryInfo = $this->getMockBuilder(MemoryInfo::class) |
|||
->setMethods(['getMemoryLimit',]) |
|||
->getMock(); |
|||
|
|||
$memoryInfo |
|||
->method('getMemoryLimit') |
|||
->willReturn($memoryLimit); |
|||
|
|||
$isMemoryLimitSufficient = $memoryInfo->isMemoryLimitSufficient(); |
|||
self::assertEquals($expected, $isMemoryLimitSufficient); |
|||
} |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue