diff options
-rw-r--r-- | CHANGELOG.txt | 2 | ||||
-rw-r--r-- | includes/bootstrap.inc | 29 | ||||
-rw-r--r-- | modules/color/color.module | 7 | ||||
-rw-r--r-- | modules/simpletest/simpletest.install | 2 | ||||
-rw-r--r-- | modules/simpletest/tests/bootstrap.test | 24 | ||||
-rw-r--r-- | modules/system/system.install | 2 |
6 files changed, 60 insertions, 6 deletions
diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 4e1a8eb13..f0a0e7f59 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,8 @@ Drupal 7.23, xxxx-xx-xx (development version) ----------------------- +- Added a drupal_check_memory_limit() API function to allow the memory limit to + be checked consistently (API addition). - Changed the default web.config file for IIS servers to allow favicon.ico files which are present in the filesystem to be accessed. - Fixed inconsistent support for the 'tel' protocol in Drupal's URL filtering diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc index eddee8886..7f4033dfb 100644 --- a/includes/bootstrap.inc +++ b/includes/bootstrap.inc @@ -3414,3 +3414,32 @@ function _drupal_shutdown_function() { } } } + +/** + * Compares the memory required for an operation to the available memory. + * + * @param $required + * The memory required for the operation, expressed as a number of bytes with + * optional SI or IEC binary unit prefix (e.g. 2, 3K, 5MB, 10G, 6GiB, 8bytes, + * 9mbytes). + * @param $memory_limit + * (optional) The memory limit for the operation, expressed as a number of + * bytes with optional SI or IEC binary unit prefix (e.g. 2, 3K, 5MB, 10G, + * 6GiB, 8bytes, 9mbytes). If no value is passed, the current PHP + * memory_limit will be used. Defaults to NULL. + * + * @return + * TRUE if there is sufficient memory to allow the operation, or FALSE + * otherwise. + */ +function drupal_check_memory_limit($required, $memory_limit = NULL) { + if (!isset($memory_limit)) { + $memory_limit = ini_get('memory_limit'); + } + + // There is sufficient memory if: + // - No memory limit is set. + // - The memory limit is set to unlimited (-1). + // - The memory limit is greater than the memory required for the operation. + return ((!$memory_limit) || ($memory_limit == -1) || (parse_size($memory_limit) >= parse_size($required))); +} diff --git a/modules/color/color.module b/modules/color/color.module index 9ae7f73de..53c54fbf6 100644 --- a/modules/color/color.module +++ b/modules/color/color.module @@ -346,9 +346,10 @@ function color_scheme_form_submit($form, &$form_state) { // memory_get_usage(), therefore we won't inadvertently reject a color // scheme change based on a faulty memory calculation. $usage = memory_get_usage(TRUE); - $limit = parse_size(ini_get('memory_limit')); - if ($usage + $required > $limit) { - drupal_set_message(t('There is not enough memory available to PHP to change this theme\'s color scheme. You need at least %size more. Check the <a href="@url">PHP documentation</a> for more information.', array('%size' => format_size($usage + $required - $limit), '@url' => 'http://www.php.net/manual/ini.core.php#ini.sect.resource-limits')), 'error'); + $memory_limit = ini_get('memory_limit'); + $size = parse_size($memory_limit); + if (!drupal_check_memory_limit($usage + $required, $memory_limit)) { + drupal_set_message(t('There is not enough memory available to PHP to change this theme\'s color scheme. You need at least %size more. Check the <a href="@url">PHP documentation</a> for more information.', array('%size' => format_size($usage + $required - $size), '@url' => 'http://www.php.net/manual/ini.core.php#ini.sect.resource-limits')), 'error'); return; } } diff --git a/modules/simpletest/simpletest.install b/modules/simpletest/simpletest.install index ea847f4ea..6c6f5694d 100644 --- a/modules/simpletest/simpletest.install +++ b/modules/simpletest/simpletest.install @@ -63,7 +63,7 @@ function simpletest_requirements($phase) { // Check the current memory limit. If it is set too low, SimpleTest will fail // to load all tests and throw a fatal error. $memory_limit = ini_get('memory_limit'); - if ($memory_limit && $memory_limit != -1 && parse_size($memory_limit) < parse_size(SIMPLETEST_MINIMUM_PHP_MEMORY_LIMIT)) { + if (!drupal_check_memory_limit(SIMPLETEST_MINIMUM_PHP_MEMORY_LIMIT, $memory_limit)) { $requirements['php_memory_limit']['severity'] = REQUIREMENT_ERROR; $requirements['php_memory_limit']['description'] = $t('The testing framework requires the PHP memory limit to be at least %memory_minimum_limit. The current value is %memory_limit. <a href="@url">Follow these steps to continue</a>.', array('%memory_limit' => $memory_limit, '%memory_minimum_limit' => SIMPLETEST_MINIMUM_PHP_MEMORY_LIMIT, '@url' => 'http://drupal.org/node/207036')); } diff --git a/modules/simpletest/tests/bootstrap.test b/modules/simpletest/tests/bootstrap.test index 84c0551cc..87b59608e 100644 --- a/modules/simpletest/tests/bootstrap.test +++ b/modules/simpletest/tests/bootstrap.test @@ -459,6 +459,29 @@ class BootstrapMiscTestCase extends DrupalUnitTestCase { $expected = array('fragment' => 'y', 'attributes' => array('title' => 'Y', 'class' => array('a', 'b', 'c', 'd')), 'language' => 'en', 'html' => TRUE); $this->assertIdentical(drupal_array_merge_deep($link_options_1, $link_options_2), $expected, 'drupal_array_merge_deep() returned a properly merged array.'); } + + /** + * Tests that the drupal_check_memory_limit() function works as expected. + */ + function testCheckMemoryLimit() { + $memory_limit = ini_get('memory_limit'); + // Test that a very reasonable amount of memory is available. + $this->assertTrue(drupal_check_memory_limit('30MB'), '30MB of memory tested available.'); + + // Get the available memory and multiply it by two to make it unreasonably + // high. + $twice_avail_memory = ($memory_limit * 2) . 'MB'; + + // The function should always return true if the memory limit is set to -1. + $this->assertTrue(drupal_check_memory_limit($twice_avail_memory, -1), 'drupal_check_memory_limit() returns TRUE when a limit of -1 (none) is supplied'); + + // Test that even though we have 30MB of memory available - the function + // returns FALSE when given an upper limit for how much memory can be used. + $this->assertFalse(drupal_check_memory_limit('30MB', '16MB'), 'drupal_check_memory_limit() returns FALSE with a 16MB upper limit on a 30MB requirement.'); + + // Test that an equal amount of memory to the amount requested returns TRUE. + $this->assertTrue(drupal_check_memory_limit('30MB', '30MB'), 'drupal_check_memory_limit() returns TRUE when requesting 30MB on a 30MB requirement.'); + } } /** @@ -506,4 +529,3 @@ class BootstrapOverrideServerVariablesTestCase extends DrupalUnitTestCase { } } } - diff --git a/modules/system/system.install b/modules/system/system.install index cf9a5d26c..a58e855ad 100644 --- a/modules/system/system.install +++ b/modules/system/system.install @@ -208,7 +208,7 @@ function system_requirements($phase) { 'value' => $memory_limit == -1 ? t('-1 (Unlimited)') : $memory_limit, ); - if ($memory_limit && $memory_limit != -1 && parse_size($memory_limit) < parse_size(DRUPAL_MINIMUM_PHP_MEMORY_LIMIT)) { + if (!drupal_check_memory_limit(DRUPAL_MINIMUM_PHP_MEMORY_LIMIT, $memory_limit)) { $description = ''; if ($phase == 'install') { $description = $t('Consider increasing your PHP memory limit to %memory_minimum_limit to help prevent errors in the installation process.', array('%memory_minimum_limit' => DRUPAL_MINIMUM_PHP_MEMORY_LIMIT)); |