From 7022dd3930857c7f914a7adf91e5f7ac4d8cf1f5 Mon Sep 17 00:00:00 2001 From: dongsheng Date: Thu, 26 Mar 2009 02:09:28 +0000 Subject: [PATCH] "MEMORY/MDL-18540,remove hard-coded php memory limit, added system setting for it, create a function reduce_memory_limit to reduce memroy limit and respect php.ini setting in the meanwhile, merged from 1.9" --- admin/health.php | 8 ++++++-- admin/settings/server.php | 8 ++++++++ backup/lib.php | 7 +++++-- backup/restore.php | 6 +++++- backup/try.php | 6 +++++- lang/en_utf8/admin.php | 2 ++ lib/setuplib.php | 36 ++++++++++++++++++++++++++++++++++++ search/cron_php5.php | 17 +++++++---------- 8 files changed, 74 insertions(+), 16 deletions(-) diff --git a/admin/health.php b/admin/health.php index 86e23b639a..71401842e4 100644 --- a/admin/health.php +++ b/admin/health.php @@ -363,7 +363,11 @@ class problem_000008 extends problem_base { } $oldmemlimit = get_real_size($oldmemlimit); //now lets change the memory limit to something unique below 128M==134217728 - @ini_set('memory_limit', 134217720); + if (empty($CFG->memorylimit)) { + raise_memory_limit('128M'); + } else { + raise_memory_limit($CFG->memorylimit); + } $testmemlimit = get_real_size(@ini_get('memory_limit')); //verify the change had any effect at all if ($oldmemlimit == $testmemlimit) { @@ -374,7 +378,7 @@ class problem_000008 extends problem_base { return false; } } - @ini_set('memory_limit', $oldmemlimit); + reduce_memory_limit($oldmemlimit); return false; } function severity() { diff --git a/admin/settings/server.php b/admin/settings/server.php index 34417daaf8..0a2819543e 100644 --- a/admin/settings/server.php +++ b/admin/settings/server.php @@ -233,6 +233,14 @@ $ADMIN->add('server', new admin_externalpage('phpinfo', get_string('phpinfo'), " // "performance" settingpage $temp = new admin_settingpage('performance', get_string('performance', 'admin')); + +$temp->add(new admin_setting_special_selectsetup('memorylimit', get_string('memorylimit', 'admin'), + get_string('configmemorylimit', 'admin'), '128M', + array( '64M' => '64M', + '128M' => '128M', + '256M' => '256M', + '1024M' => '1024M' + ))); $temp->add(new admin_setting_special_selectsetup('cachetype', get_string('cachetype', 'admin'), get_string('configcachetype', 'admin'), '', array( '' => get_string('none'), diff --git a/backup/lib.php b/backup/lib.php index 964f69cb6b..307ec55b3f 100644 --- a/backup/lib.php +++ b/backup/lib.php @@ -547,9 +547,12 @@ mtrace($debuginfo.'Required function check failed (see backup_required_functions)'); return false; } - @ini_set("max_execution_time","3000"); - raise_memory_limit("192M"); + if (empty($CFG->memorylimit)) { + raise_memory_limit('128M'); + } else { + raise_memory_limit($CFG->memorylimit); + } if (!$backup_unique_code = restore_precheck($destinationcourse,$pathtofile,$errorstr,true)) { mtrace($debuginfo.'Failed restore_precheck (error was '.$errorstr.')'); diff --git a/backup/restore.php b/backup/restore.php index af07a59054..6e583ea9d9 100644 --- a/backup/restore.php +++ b/backup/restore.php @@ -141,7 +141,11 @@ //Adjust some php variables to the execution of this script @ini_set("max_execution_time","3000"); - raise_memory_limit("192M"); + if (empty($CFG->memorylimit)) { + raise_memory_limit('128M'); + } else { + raise_memory_limit($CFG->memorylimit); + } //Call the form, depending the step we are diff --git a/backup/try.php b/backup/try.php index 038f7b3fe8..83cf2ca557 100644 --- a/backup/try.php +++ b/backup/try.php @@ -19,7 +19,11 @@ //Adjust some php variables to the execution of this script @ini_set("max_execution_time","3000"); - raise_memory_limit("192M"); + if (empty($CFG->memorylimit)) { + raise_memory_limit('128M'); + } else { + raise_memory_limit($CFG->memorylimit); + } echo "
\n";
 
diff --git a/lang/en_utf8/admin.php b/lang/en_utf8/admin.php
index 9120b2c03e..65e60cb55b 100644
--- a/lang/en_utf8/admin.php
+++ b/lang/en_utf8/admin.php
@@ -184,6 +184,7 @@ $string['configmaxeditingtime'] = 'This specifies the amount of time people have
 $string['configmaxevents'] = 'Events to Lookahead';
 $string['configmemcachedhosts'] = 'For memcached. Comma-separated list of hosts that are running the memcached daemon. Use IP addresses to avoid DNS latency. memcached does not behave well if you add/remove hosts on a running setup.';
 $string['configmemcachedpconn'] = 'For memcached. Use persistent connections. Use carefully -- it can make Apache/PHP crash after a restart of the memcached daemon.';
+$string['configmemorylimit'] = 'This sets the maximum amount of memory that a script is allowed to allocate. This option is applied to search indexing, backup/restore and admin/health scripts.';
 $string['configmessaging'] = 'Should the messaging system between site users be enabled?';
 $string['configminpassworddigits'] = 'Passwords must have at least these many digits.';
 $string['configminpasswordlength'] = 'Passwords must be at least these many characters long.';
@@ -550,6 +551,7 @@ $string['mediapluginswfnote'] = 'As a default security measure, normal users sho
 $string['mediapluginwmv'] = 'Enable .wmv filter';
 $string['memcachedhosts'] = 'memcached hosts';
 $string['memcachedpconn'] = 'memcached use persistent connections';
+$string['memorylimit'] = 'PHP memory limit';
 $string['messaging'] = 'Enable messaging system';
 $string['minpasswordlength'] = 'Password Length';
 $string['minpassworddigits'] = 'Digits';
diff --git a/lib/setuplib.php b/lib/setuplib.php
index 67be6bca66..3aa0a20214 100644
--- a/lib/setuplib.php
+++ b/lib/setuplib.php
@@ -281,6 +281,42 @@ function raise_memory_limit($newlimit) {
     return false;
 }
 
+/**
+ * Function to reduce the memory limit to a new value.
+ * Will respect the memory limit if it is lower, thus allowing
+ * settings in php.ini, apache conf or command line switches
+ * to override it
+ *
+ * The memory limit should be expressed with a string (eg:'64M')
+ *
+ * @param string $newlimit the new memory limit
+ * @return bool
+ */
+function reduce_memory_limit ($newlimit) {
+    if (empty($newlimit)) {
+        return false;
+    }
+    $cur = @ini_get('memory_limit');
+    if (empty($cur)) {
+        // if php is compiled without --enable-memory-limits
+        // apparently memory_limit is set to ''
+        $cur=0;
+    } else {
+        if ($cur == -1){
+            return true; // unlimited mem!
+        }
+        $cur = get_real_size($cur);
+    }
+
+    $new = get_real_size($newlimit);
+    // -1 is smaller, but it means unlimited
+    if ($new < $cur && $new != -1) {
+        ini_set('memory_limit', $newlimit);
+        return true;
+    }
+    return false;
+}
+
 /**
  * Converts numbers like 10M into bytes.
  *
diff --git a/search/cron_php5.php b/search/cron_php5.php
index a9cd57fcb5..b6542f55ec 100644
--- a/search/cron_php5.php
+++ b/search/cron_php5.php
@@ -13,11 +13,12 @@
 */
 
 try{
-    // overrides php limits
-    $maxtimelimit = ini_get('max_execution_time');
-    ini_set('max_execution_time', 600);
-    $maxmemoryamount = ini_get('memory_limit');
-    ini_set('memory_limit', '96M');
+    ini_set('max_execution_time', 300);
+    if (empty($CFG->memorylimit)) {
+        raise_memory_limit('128M');
+    } else {
+        raise_memory_limit($CFG->memorylimit);
+    }
 
     mtrace("\n--DELETE----");
     require_once($CFG->dirroot.'/search/delete.php');
@@ -28,13 +29,9 @@ try{
     mtrace("------------");
     //mtrace("cron finished.
"); mtrace('done'); - - // set back normal values for php limits - ini_set('max_execution_time', $maxtimelimit); - ini_set('memory_limit', $maxmemoryamount); } catch(Exception $ex){ mtrace('Fatal exception from Lucene subsystem. Search engine may not have been updated.'); mtrace($ex); } -?> \ No newline at end of file +?> -- 2.39.5