Permalink
Browse files

API CHANGE Obeying existing memory_limit settings in increase_memory_…

…limmit_to(). Introduced set_increase_memory_limit_max() and set_increase_time_limit_max()
  • Loading branch information...
1 parent 54b81a3 commit 715638333ec47269876e57a574ad6c79b85f4891 @chillu chillu committed Aug 30, 2011
Showing with 98 additions and 4 deletions.
  1. +69 −4 core/Core.php
  2. +19 −0 docs/en/topics/configuration.md
  3. +10 −0 tests/MemoryLimitTest.php
View
@@ -366,22 +366,55 @@ function _t($entity, $string = "", $priority = 40, $context = "") {
/**
* Increase the memory limit to the given level if it's currently too low.
+ * Only increases up to the maximum defined in {@link set_increase_memory_limit_max()},
+ * and defaults to the 'memory_limit' setting in the PHP configuration.
+ *
* @param A memory limit string, such as "64M". If omitted, unlimited memory will be set.
+ * @return Boolean TRUE indicates a successful change, FALSE a denied change.
*/
function increase_memory_limit_to($memoryLimit = -1) {
$curLimit = ini_get('memory_limit');
// Can't go higher than infinite
- if($curLimit == -1) return;
+ if($curLimit == -1 ) return true;
+
+ // Check hard maximums
+ $max = get_increase_memory_limit_max();
+ if($max != -1 && translate_memstring($memoryLimit) > translate_memstring($max)) return false;
// Increase the memory limit if it's too low
if($memoryLimit == -1 || translate_memstring($memoryLimit) > translate_memstring($curLimit)) {
ini_set('memory_limit', $memoryLimit);
- }
+ }
+
+ return true;
+}
+
+$_increase_memory_limit_max = ini_get('memory_limit');
+
+/**
+ * Set the maximum allowed value for {@link increase_memory_limit_to()}.
+ * The same result can also be achieved through 'suhosin.memory_limit'
+ * if PHP is running with the Suhosin system.
+ *
+ * @param Memory limit string
+ */
+function set_increase_memory_limit_max($memoryLimit) {
+ global $_increase_memory_limit_max;
+ $_increase_memory_limit_max = $memoryLimit;
+}
+
+/**
+ * @return Memory limit string
+ */
+function get_increase_memory_limit_max() {
+ global $_increase_memory_limit_max;
+ return $_increase_memory_limit_max;
}
/**
* Turn a memory string, such as 512M into an actual number of bytes.
+ *
* @param A memory limit string, such as "64M"
*/
function translate_memstring($memString) {
@@ -394,18 +427,50 @@ function translate_memstring($memString) {
}
/**
- * Increase the time limit of this script. By default, the time will be unlimited.
+ * Increase the time limit of this script. By default, the time will be unlimited.
+ * Only works if 'safe_mode' is off in the PHP configuration.
+ * Only values up to {@link get_increase_time_limit_max()} are allowed.
+ *
* @param $timeLimit The time limit in seconds. If omitted, no time limit will be set.
+ * @return Boolean TRUE indicates a successful change, FALSE a denied change.
*/
function increase_time_limit_to($timeLimit = null) {
+ $max = get_increase_time_limit_max();
+ if($max != -1 && $timeLimit > $max) return false;
+
if(!ini_get('safe_mode')) {
if(!$timeLimit) {
set_time_limit(0);
+ return true;
} else {
$currTimeLimit = ini_get('max_execution_time');
+ // Only increase if its smaller
if($currTimeLimit && $currTimeLimit < $timeLimit) {
set_time_limit($timeLimit);
- }
+ }
+ return true;
}
+ } else {
+ return false;
}
}
+
+$_increase_time_limit_max = -1;
+
+/**
+ * Set the maximum allowed value for {@link increase_timeLimit_to()};
+ *
+ * @param Int Limit in seconds
+ */
+function set_increase_time_limit_max($timeLimit) {
+ global $_increase_time_limit_max;
+ $_increase_time_limit_max = $timeLimit;
+}
+
+/**
+ * @return Int Limit in seconds
+ */
+function get_increase_time_limit_max() {
+ global $_increase_time_limit_max;
+ return $_increase_time_limit_max;
+}
@@ -74,6 +74,25 @@ All user-related preferences are stored as a property of the `[api:Member]`-clas
See [security](/topics/security) and [permission](/reference/permission)
+## Resource Usage (Memory and CPU)
+
+SilverStripe tries to keep its resource usage within the documented limits (see our [server requirements](../installation/server-requirements)).
+These limits are defined through `memory_limit` and `max_execution_time` in the PHP configuration.
+They can be overwritten through `ini_set()`, unless PHP is running with the [Suhoshin Patches](http://www.hardened-php.net/)
+or in "[safe mode](http://php.net/manual/en/features.safe-mode.php)".
+Most shared hosting providers will have maximum values that can't be altered.
+
+For certain tasks like synchronizing a large `assets/` folder with all file and folder entries in the database,
+more resources are required temporarily. In general, we recommend running resource intensive tasks
+through the [commandline](../topics/commandline), where configuration defaults for these settings are higher or even unlimited.
+
+SilverStripe can request more resources through `increase_memory_limit_to()` and `increase_time_limit_to()`.
+If you are concerned about resource usage on a dedicated server (without restrictions imposed through shared hosting providers), you can set a hard limit to these increases through
+`set_increase_memory_limit_max()` and `set_increase_time_limit_max()`.
+These values will just be used for specific scripts (e.g. `[api:Filesystem::sync()]`),
+to raise the limits for all executed scripts please use `ini_set('memory_limit', <value>)`
+and `ini_set('max_execution_time', <value>)` in your own `_config.php`.
+
## See Also
[Config Cheat sheet](http://www.ssbits.com/a-config-php-cheatsheet/)
View
@@ -1,4 +1,8 @@
<?php
+/**
+ * @package sapphire
+ * @subpackage tests
+ */
class MemoryLimitTest extends SapphireTest {
@@ -66,10 +70,16 @@ function testIncreaseTimeLimitTo() {
function setUp() {
$this->origMemLimit = ini_get('memory_limit');
$this->origTimeLimit = ini_get('max_execution_time');
+ $this->origMemLimitMax = get_increase_memory_limit_max();
+ $this->origTimeLimitMax = get_increase_time_limit_max();
+ set_increase_memory_limit_max(-1);
+ set_increase_time_limit_max(-1);
}
function tearDown() {
ini_set('memory_limit', $this->origMemLimit);
set_time_limit($this->origTimeLimit);
+ set_increase_memory_limit_max($this->origMemLimitMax);
+ set_increase_time_limit_max($this->origTimeLimitMax);
}
/**

0 comments on commit 7156383

Please sign in to comment.