-
Notifications
You must be signed in to change notification settings - Fork 11.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[8.x] Free reserved memory before handling fatal errors #42630
Merged
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
When the PHP process exceeds the configured memory limit, a fatal error such as the following occurs: ``` Allowed memory size of 1073741824 bytes exhausted (tried to allocate 3358976 bytes) ``` Currently, the process abruptly exits in such cases without and indication as to what has caused the error. This is because the handler from `register_shutdown_function()` attempts to instantiate a `FatalError` instance, thus trying to use memory that is not available. This clears the reserved memory before this instantiation, thus ensuring that the process has enough memory to properly handle the error. Reserved memory is also cleared in `handleException` in the same way.
spawnia
changed the title
Free reserved memory before handling fatal errors
[8.x] Free reserved memory before handling fatal errors
Jun 2, 2022
taylorotwell
added a commit
that referenced
this pull request
Jun 3, 2022
* Increase reserved memory for error handling Follow up to #42630 The error handler should be able to report exceptions arising from exceeding the PHP memory limit. Because of changes made to error handling, the previously configured value is no longer sufficiently large. A similar change was also done in Symfony a while ago, see symfony/symfony#44327. I used the following artisan command to determine the amount of memory required for error handling, using a reporter that simply writes to a file: ```php <?php declare(strict_types=1); namespace App\Console\Commands; use Illuminate\Console\Command; final class MeasureHandlerMemory extends Command { protected $signature = 'measure-handler-memory'; private int $peak; public function handle(): void { $this->peak = memory_get_peak_usage(); trigger_error('', E_USER_ERROR); } public function __destruct() { $used = memory_get_peak_usage() - $this->peak; echo "error handling used: " . $used . "\n"; $before = memory_get_usage(); $times = 10240; $reserve = str_repeat('x', $times); $after = memory_get_usage() - $before; echo 'repeat times ' . $times . ' reserves: ' . $after . "\n"; $ratio = $after / $times; echo 'ratio between bytes and repeat: ' . $ratio . "\n"; echo 'minimum times to repeat: ' . $used / $ratio . "\n"; } } ``` * Free memory in HandleExceptions::handleShutdown() While validating the effectiveness of #42630 in our application, I found that the call `$error = error_get_last()` causes a tiny bit of memory usage. Thus, I think it is better to clear memory as soon as entering the handler. * Update HandleExceptions.php Co-authored-by: Taylor Otwell <[email protected]>
chu121su12
pushed a commit
to chu121su12/framework
that referenced
this pull request
Jun 6, 2022
* Increase reserved memory for error handling Follow up to laravel#42630 The error handler should be able to report exceptions arising from exceeding the PHP memory limit. Because of changes made to error handling, the previously configured value is no longer sufficiently large. A similar change was also done in Symfony a while ago, see symfony/symfony#44327. I used the following artisan command to determine the amount of memory required for error handling, using a reporter that simply writes to a file: ```php <?php declare(strict_types=1); namespace App\Console\Commands; use Illuminate\Console\Command; final class MeasureHandlerMemory extends Command { protected $signature = 'measure-handler-memory'; private int $peak; public function handle(): void { $this->peak = memory_get_peak_usage(); trigger_error('', E_USER_ERROR); } public function __destruct() { $used = memory_get_peak_usage() - $this->peak; echo "error handling used: " . $used . "\n"; $before = memory_get_usage(); $times = 10240; $reserve = str_repeat('x', $times); $after = memory_get_usage() - $before; echo 'repeat times ' . $times . ' reserves: ' . $after . "\n"; $ratio = $after / $times; echo 'ratio between bytes and repeat: ' . $ratio . "\n"; echo 'minimum times to repeat: ' . $used / $ratio . "\n"; } } ``` * Free memory in HandleExceptions::handleShutdown() While validating the effectiveness of laravel#42630 in our application, I found that the call `$error = error_get_last()` causes a tiny bit of memory usage. Thus, I think it is better to clear memory as soon as entering the handler. * Update HandleExceptions.php Co-authored-by: Taylor Otwell <[email protected]>
chu121su12
pushed a commit
to chu121su12/framework
that referenced
this pull request
Jun 6, 2022
When the PHP process exceeds the configured memory limit, a fatal error such as the following occurs: ``` Allowed memory size of 1073741824 bytes exhausted (tried to allocate 3358976 bytes) ``` Currently, the process abruptly exits in such cases without and indication as to what has caused the error. This is because the handler from `register_shutdown_function()` attempts to instantiate a `FatalError` instance, thus trying to use memory that is not available. This clears the reserved memory before this instantiation, thus ensuring that the process has enough memory to properly handle the error. Reserved memory is also cleared in `handleException` in the same way.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Free reserved memory before handling fatal errors
When the PHP process exceeds the configured memory limit,
a fatal error such as the following occurs:
Currently, the process abruptly exits in such cases without
and indication as to what has caused the error. This is
because the handler from
register_shutdown_function()
attempts to instantiate a
FatalError
instance, thus tryingto use memory that is not available.
This clears the reserved memory before this instantiation,
thus ensuring that the process has enough memory to
properly handle the error. Reserved memory is also cleared
in
handleException
in the same way.