mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 12:05:37 +00:00
Merge pull request #2286 from hafriedlander/fix/flush_24
FIX Flush on memory exhaustion and when headers sent
This commit is contained in:
commit
fe3f58511d
@ -46,6 +46,13 @@ foreach($envFiles as $envFile) {
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// GLOBALS AND DEFINE SETTING
|
||||
|
||||
function stripslashes_recursively(&$array) {
|
||||
foreach($array as $k => $v) {
|
||||
if(is_array($v)) stripslashes_recursively($array[$k]);
|
||||
else $array[$k] = stripslashes($v);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A blank HTTP_HOST value is used to detect command-line execution.
|
||||
* We update the $_SERVER variable to contain data consistent with the rest of the application.
|
||||
|
@ -153,13 +153,6 @@ function project() {
|
||||
return $project;
|
||||
}
|
||||
|
||||
function stripslashes_recursively(&$array) {
|
||||
foreach($array as $k => $v) {
|
||||
if(is_array($v)) stripslashes_recursively($array[$k]);
|
||||
else $array[$k] = stripslashes($v);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @see i18n::_t()
|
||||
*/
|
||||
|
@ -74,9 +74,33 @@ class ErrorControlChain {
|
||||
return $error && ($error['type'] & self::$fatal_errors) != 0;
|
||||
}
|
||||
|
||||
protected function lastErrorWasMemoryExhaustion() {
|
||||
$error = error_get_last();
|
||||
$message = $error ? $error['message'] : '';
|
||||
return stripos($message, 'memory') !== false && stripos($message, 'exhausted') !== false;
|
||||
}
|
||||
|
||||
static $transtable = array(
|
||||
'k' => 1024,
|
||||
'm' => 1048576,
|
||||
'g' => 1073741824
|
||||
);
|
||||
|
||||
protected function translateMemstring($memString) {
|
||||
$char = strtolower(substr($memString, -1));
|
||||
$fact = isset(self::$transtable[$char]) ? self::$transtable[$char] : 1;
|
||||
return ((int)$memString) * $fact;
|
||||
}
|
||||
|
||||
public function handleFatalError() {
|
||||
if ($this->handleFatalErrors && $this->suppression) {
|
||||
if ($this->lastErrorWasFatal()) {
|
||||
if ($this->lastErrorWasMemoryExhaustion()) {
|
||||
// Bump up memory limit by an arbitrary 10% / 10MB (whichever is bigger) since we've run out
|
||||
$cur = $this->translateMemstring(ini_get('memory_limit'));
|
||||
if ($cur != -1) ini_set('memory_limit', $cur + max(round($cur*0.1), 10000000));
|
||||
}
|
||||
|
||||
$this->error = true;
|
||||
$this->step();
|
||||
}
|
||||
|
@ -91,10 +91,17 @@ class ParameterConfirmationToken {
|
||||
unset($params['url']);
|
||||
|
||||
// Join them all together into the original URL
|
||||
$location = "$proto://" . $host . BASE_URL . $url . ($params ? '?'.http_build_query($params) : '');
|
||||
$location = "$proto://" . $host . '/' . ltrim(BASE_URL, '/') . $url . ($params ? '?'.http_build_query($params) : '');
|
||||
|
||||
// And redirect
|
||||
header('location: '.$location, true, 302);
|
||||
if (headers_sent()) {
|
||||
echo "
|
||||
<script>location.href='$location';</script>
|
||||
<noscript><meta http-equiv='refresh' content='0; url=$location'></noscript>
|
||||
You are being redirected. If you are not redirected soon, <a href='$location'>click here to continue the flush</a>
|
||||
";
|
||||
}
|
||||
else header('location: '.$location, true, 302);
|
||||
die;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user