From 691693304b0ccafda3c2002452a8b8b8afe729f3 Mon Sep 17 00:00:00 2001 From: Angie Byron Date: Wed, 5 Aug 2009 15:58:35 +0000 Subject: #193383 by TheRec, JirkaRybka, and Bart Jansens: Centralize calls to set_time_limit() and prevent warnings/errors. --- includes/common.inc | 38 ++++++++++++++++++++++++++--- includes/locale.inc | 6 ++--- modules/node/node.module | 7 +++--- modules/simpletest/drupal_web_test_case.php | 2 +- scripts/run-tests.sh | 6 ++--- 5 files changed, 42 insertions(+), 17 deletions(-) diff --git a/includes/common.inc b/includes/common.inc index 205932b36..bad796820 100644 --- a/includes/common.inc +++ b/includes/common.inc @@ -2294,6 +2294,38 @@ function drupal_map_assoc($array, $function = NULL) { } } +/** + * Attempts to set the PHP maximum execution time. + * + * This function is a wrapper around the PHP function set_time_limit(). + * When called, set_time_limit() restarts the timeout counter from zero. + * In other words, if the timeout is the default 30 seconds, and 25 seconds + * into script execution a call such as set_time_limit(20) is made, the + * script will run for a total of 45 seconds before timing out. + * + * It also means that it is possible to decrease the total time limit if + * the sum of the new time limit and the current time spent running the + * script is inferior to the original time limit. It is inherent to the way + * set_time_limit() works, it should rather be called with an appropriate + * value every time you need to allocate a certain amount of time + * to execute a task than only once at the beginning of the script. + * + * Before calling set_time_limit(), we check if this function is available + * because it could be disabled by the server administrator. We also hide all + * the errors that could occur when calling set_time_limit(), because it is + * not possible to reliably ensure that PHP or a security extension will + * not issue a warning/error if they prevent the use of this function. + * + * @param $time_limit + * An integer specifying the new time limit, in seconds. A value of 0 + * indicates unlimited execution time. + */ +function drupal_set_time_limit($time_limit) { + if (function_exists('set_time_limit')) { + @set_time_limit($time_limit); + } +} + /** * Returns the path to a system item (module, theme, etc.). * @@ -3555,10 +3587,8 @@ function drupal_cron_run() { // Allow execution to continue even if the request gets canceled. @ignore_user_abort(TRUE); - // Try to increase the maximum execution time if it is too low. - if (ini_get('max_execution_time') < 240) { - @set_time_limit(240); - } + // Try to allocate enough time to run all the hook_cron implementations. + drupal_set_time_limit(240); // Fetch the cron semaphore $semaphore = variable_get('cron_semaphore', FALSE); diff --git a/includes/locale.inc b/includes/locale.inc index 4adbae975..1c79636c6 100644 --- a/includes/locale.inc +++ b/includes/locale.inc @@ -1167,10 +1167,8 @@ function locale_add_language($langcode, $name = NULL, $native = NULL, $direction * Text group to import PO file into (eg. 'default' for interface translations) */ function _locale_import_po($file, $langcode, $mode, $group = NULL) { - // If not in 'safe mode', increase the maximum execution time. - if (!ini_get('safe_mode')) { - set_time_limit(240); - } + // Try to allocate enough time to parse and import the data. + drupal_set_time_limit(240); // Check if we have the language already in the database. if (!db_query("SELECT COUNT(language) FROM {languages} WHERE language = :language", array(':language' => $langcode))->fetchField()) { diff --git a/modules/node/node.module b/modules/node/node.module index 5d8f3b5a7..5534d0b3c 100644 --- a/modules/node/node.module +++ b/modules/node/node.module @@ -2652,10 +2652,9 @@ function node_access_rebuild($batch_mode = FALSE) { batch_set($batch); } else { - // If not in 'safe mode', increase the maximum execution time. - if (!ini_get('safe_mode')) { - set_time_limit(240); - } + // Try to allocate enough time to rebuild node grants + drupal_set_time_limit(240); + $nids = db_query("SELECT nid FROM {node}")->fetchCol(); foreach ($nids as $nid) { $node = node_load($nid, NULL, TRUE); diff --git a/modules/simpletest/drupal_web_test_case.php b/modules/simpletest/drupal_web_test_case.php index 4af15d36a..5bb6c51a9 100644 --- a/modules/simpletest/drupal_web_test_case.php +++ b/modules/simpletest/drupal_web_test_case.php @@ -1110,7 +1110,7 @@ class DrupalWebTestCase extends DrupalTestCase { // directory will have been created already. variable_set('file_directory_path', $directory); - set_time_limit($this->timeLimit); + drupal_set_time_limit($this->timeLimit); } /** diff --git a/scripts/run-tests.sh b/scripts/run-tests.sh index 37d3c4399..26d724492 100755 --- a/scripts/run-tests.sh +++ b/scripts/run-tests.sh @@ -70,10 +70,8 @@ if ($args['list']) { $test_list = simpletest_script_get_test_list(); -// If not in 'safe mode', increase the maximum execution time. -if (!ini_get('safe_mode')) { - set_time_limit(0); -} +// Try to allocate unlimited time to run the tests. +drupal_set_time_limit(0); simpletest_script_reporter_init(); -- cgit v1.2.3