diff --git a/application/cmdbabstract.class.inc.php b/application/cmdbabstract.class.inc.php index 9ec7954a1..d43a55735 100644 --- a/application/cmdbabstract.class.inc.php +++ b/application/cmdbabstract.class.inc.php @@ -3223,9 +3223,10 @@ EOF utils::RemoveTransaction($sTransactionId); } $iPreviousTimeLimit = ini_get('max_execution_time'); + $iLoopTimeLimit = MetaModel::GetConfig()->Get('max_execution_time_per_loop'); foreach($aSelectedObj as $iId) { - set_time_limit(5); + set_time_limit($iLoopTimeLimit); $oObj = MetaModel::GetObject($sClass, $iId); $aErrors = $oObj->UpdateObjectFromPostedForm(''); $bResult = (count($aErrors) == 0); diff --git a/core/bulkchange.class.inc.php b/core/bulkchange.class.inc.php index 6bb7ab651..71ad58716 100644 --- a/core/bulkchange.class.inc.php +++ b/core/bulkchange.class.inc.php @@ -789,9 +789,10 @@ class BulkChange $aVisited = array(); } $iPreviousTimeLimit = ini_get('max_execution_time'); + $iLoopTimeLimit = MetaModel::GetConfig()->Get('max_execution_time_per_loop'); foreach($this->m_aData as $iRow => $aRowData) { - set_time_limit(5); + set_time_limit($iLoopTimeLimit); if (isset($aResult[$iRow]["__STATUS__"])) { // An issue at the earlier steps - skip the rest @@ -910,7 +911,7 @@ class BulkChange $iObj = $oObj->GetKey(); if (!in_array($iObj, $aVisited)) { - set_time_limit(5); + set_time_limit($iLoopTimeLimit); $iRow++; $this->UpdateMissingObject($aResult, $iRow, $oObj, $oChange); } diff --git a/core/config.class.inc.php b/core/config.class.inc.php index b7c403959..0e9386fae 100644 --- a/core/config.class.inc.php +++ b/core/config.class.inc.php @@ -700,6 +700,15 @@ class Config 'source_of_value' => '', 'show_in_conf_sample' => true, ), + 'max_execution_time_per_loop' => array( + 'type' => 'integer', + 'description' => 'Maximum execution time requested, per loop, during bulk operations. Zero means no limit.', + // examples... not used + 'default' => 30, + 'value' => 30, + 'source_of_value' => '', + 'show_in_conf_sample' => false, + ), ); public function IsProperty($sPropCode) diff --git a/core/dbobject.class.php b/core/dbobject.class.php index b58832f3d..94c88eb99 100644 --- a/core/dbobject.class.php +++ b/core/dbobject.class.php @@ -1,5 +1,5 @@ Get('max_execution_time_per_loop'); + } if (is_null($oDeletionPlan)) { $oDeletionPlan = new DeletionPlan(); @@ -1857,7 +1862,7 @@ abstract class DBObject // As a temporary fix: delete only the objects that are still to be deleted... if ($oToDelete->m_bIsInDB) { - set_time_limit(5); + set_time_limit($iLoopTimeLimit); $oToDelete->DBDeleteSingleObject(); } } @@ -1871,7 +1876,7 @@ abstract class DBObject foreach ($aData['attributes'] as $sRemoteExtKey => $aRemoteAttDef) { $oToUpdate->Set($sRemoteExtKey, $aData['values'][$sRemoteExtKey]); - set_time_limit(5); + set_time_limit($iLoopTimeLimit); $oToUpdate->DBUpdate(); } } @@ -2326,6 +2331,11 @@ abstract class DBObject private function MakeDeletionPlan(&$oDeletionPlan, $aVisited = array(), $iDeleteOption = null) { + static $iLoopTimeLimit = null; + if ($iLoopTimeLimit == null) + { + $iLoopTimeLimit = MetaModel::GetConfig()->Get('max_execution_time_per_loop'); + } $sClass = get_class($this); $iThisId = $this->GetKey(); @@ -2359,7 +2369,7 @@ abstract class DBObject { foreach ($aPotentialDeletes as $sRemoteExtKey => $aData) { - set_time_limit(5); + set_time_limit($iLoopTimeLimit); $oAttDef = $aData['attribute']; $iDeletePropagationOption = $oAttDef->GetDeletionPropagationOption(); diff --git a/core/deletionplan.class.inc.php b/core/deletionplan.class.inc.php index 23024f082..10413cd30 100644 --- a/core/deletionplan.class.inc.php +++ b/core/deletionplan.class.inc.php @@ -110,12 +110,12 @@ class DeletionPlan // Getting and setting time limit are not symetric: // www.php.net/manual/fr/function.set-time-limit.php#72305 $iPreviousTimeLimit = ini_get('max_execution_time'); - + $iLoopTimeLimit = MetaModel::GetConfig()->Get('max_execution_time_per_loop'); foreach($this->m_aToUpdate as $sClass => $aToUpdate) { foreach($aToUpdate as $iId => $aData) { - set_time_limit(5); + set_time_limit($iLoopTimeLimit); $this->m_iToUpdate++; $oObject = $aData['to_reset'];