rfc:error_handler_callback_parameters_passed_by_reference
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
rfc:error_handler_callback_parameters_passed_by_reference [2015/01/27 01:49] – reeze | rfc:error_handler_callback_parameters_passed_by_reference [2017/09/22 13:28] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== PHP RFC: Allow error_handler callback parameters to be passed by reference ====== | ====== PHP RFC: Allow error_handler callback parameters to be passed by reference ====== | ||
- | * Version: 0.1 | + | * Version: 0.2 |
- | * Date: 2015-01-26 (initial draft) | + | * Date: 2015-02-28 |
* Authors: Reeze Xia < | * Authors: Reeze Xia < | ||
- | * Status: | + | * Status: |
* First Published at: http:// | * First Published at: http:// | ||
Line 17: | Line 17: | ||
We are proposing to enable error_handler callback parameters to be passed by | We are proposing to enable error_handler callback parameters to be passed by | ||
reference to be able to append additional data to error messages. | reference to be able to append additional data to error messages. | ||
- | This includes | + | |
+ | This includes | ||
+ | |||
+ | 1. The first four parameters ($errno, $errstr, $errfile, $errline) | ||
+ | |||
+ | 2. OR only allow $errstr | ||
Examples: | Examples: | ||
- | 1. Add username from $_SESSION to error_log: | + | 1. Add username from $_SESSION to error_log |
<file php test1.php> | <file php test1.php> | ||
Line 51: | Line 56: | ||
- | 2. Add stack trace to error_log: | + | 2. Add stack trace to error_log |
<file php test2.php> | <file php test2.php> | ||
Line 141: | Line 146: | ||
Current versions of php.net allow passing parameters for a custom error handler by reference (without warnings), but they don't have any effect. | Current versions of php.net allow passing parameters for a custom error handler by reference (without warnings), but they don't have any effect. | ||
Therefore, framework maintainers can use error handler callback parameters by reference without any problems in older php versions. This change is fully backward compatible. | Therefore, framework maintainers can use error handler callback parameters by reference without any problems in older php versions. This change is fully backward compatible. | ||
+ | |||
+ | All logged errors are still limited by log_errors_max_len (default 1024 bytes). | ||
===== Proposed PHP Version(s) ===== | ===== Proposed PHP Version(s) ===== | ||
Line 165: | Line 172: | ||
==== Performance ==== | ==== Performance ==== | ||
- | TODO | + | Performance is not affected in normal code execution. In case of an error that can be handled in user-space, we need to copy the referenced variables back to their origins. |
===== Open Issues ===== | ===== Open Issues ===== | ||
Line 188: | Line 195: | ||
gives: | gives: | ||
+ | < | ||
PHP Notice: | PHP Notice: | ||
+ | </ | ||
instead of: | instead of: | ||
+ | < | ||
PHP Notice: | PHP Notice: | ||
+ | </ | ||
+ | This issue is not related to this rfc and handled separately on https:// | ||
2. Callback parameter errstr can be changed to an empty string, example: | 2. Callback parameter errstr can be changed to an empty string, example: | ||
Line 213: | Line 225: | ||
gives: | gives: | ||
+ | < | ||
PHP Notice: | PHP Notice: | ||
+ | </ | ||
+ | This is similar to using the @ operator or returning true in the callback function. It is up to the userland developer to avoid this. | ||
3. Shall we allow $errno, $errstr, $errfile, $errline or only $errstr to be passed by reference? | 3. Shall we allow $errno, $errstr, $errfile, $errline or only $errstr to be passed by reference? | ||
Line 237: | Line 252: | ||
Possible, but may not come into major distributions if they stick to special minor releases | Possible, but may not come into major distributions if they stick to special minor releases | ||
(e.g. Ubuntu 14.04: 5.5.9, Ubuntu 14.10: 5.5.12, latest: 5.5.21) | (e.g. Ubuntu 14.04: 5.5.9, Ubuntu 14.10: 5.5.12, latest: 5.5.21) | ||
+ | |||
+ | 5. Why can't you just use the error_log() function to write the exact message you want? | ||
+ | |||
+ | In the future, set_error_handler() might be changed to be called multiple times with different custom error handlers, similar to how register_shutdown_function() and spl_autoload_register() act on multiple calls. | ||
+ | Having a chain of error handlers appending data to $errstr makes it difficult to use error_log(), | ||
+ | php.ini, which might not be the desired behaviour. For completeness, | ||
+ | $file, so an example would look like this: | ||
+ | |||
+ | <file php test_error_log.php> | ||
+ | function myErrorHandler($errno, | ||
+ | switch($errno){ | ||
+ | case E_WARNING: | ||
+ | case E_NOTICE: | ||
+ | case E_STRICT: | ||
+ | case E_RECOVERABLE_ERROR: | ||
+ | case E_DEPRECATED: | ||
+ | case E_USER_ERROR: | ||
+ | case E_USER_WARNING: | ||
+ | case E_USER_NOTICE: | ||
+ | case E_USER_DEPRECATED: | ||
+ | } | ||
+ | if (!empty($_SESSION[' | ||
+ | $errstr .= ', username: ' | ||
+ | } | ||
+ | error_log(' | ||
+ | return true; | ||
+ | } | ||
+ | </ | ||
===== Future Scope ===== | ===== Future Scope ===== | ||
set_error_handler() callback might be able to handle E_ERROR to be able to append additional information to memory_limit exhaustions (or others). | set_error_handler() callback might be able to handle E_ERROR to be able to append additional information to memory_limit exhaustions (or others). | ||
- | For example try to analyze and fix: [13-Jan-2015 09:24:37 Europe/ | ||
- | ===== Proposed Voting Choices | + | For example try to analyze and fix: |
+ | < | ||
+ | | ||
+ | </ | ||
+ | |||
+ | ===== Vote ===== | ||
+ | |||
+ | This RFC requires a 50%+1 majority, meaning the first two choices count as Yes, the third choice counts as No. Voting started on 2015-02-13 and will end on 2015-02-27. | ||
- | This RFC requires | + | <doodle title=" |
+ | * Allow $errstr parameter to be passed by reference | ||
+ | * Allow $errno, $errstr, $errfile, $fileno parameter to be passed by reference | ||
+ | * No, Allow none of the parameter be a reference parameter | ||
+ | </ | ||
===== Patches and Tests ===== | ===== Patches and Tests ===== | ||
- | Currently implemented on https:// | + | Currently implemented on https:// |
PR is against master and includes the first four callback parameters to be passed by reference. | PR is against master and includes the first four callback parameters to be passed by reference. | ||
+ | The PR will be updated to correspond vote if any one of the accepted. | ||
I've used to build on Ubuntu 14.04: | I've used to build on Ubuntu 14.04: | ||
Line 266: | Line 320: | ||
===== References ===== | ===== References ===== | ||
- | Discussion on php-internals: | + | * Discussion on php-internals: |
- | Discussion on github: https:// | + | |
===== Rejected Features ===== | ===== Rejected Features ===== | ||
Line 275: | Line 329: | ||
===== Changelog ===== | ===== Changelog ===== | ||
- | v0.1 - Initial draft (thbley) | + | * v0.2 - updated open issues (thbley) |
+ | * v0.1 - Initial draft (thbley) |
rfc/error_handler_callback_parameters_passed_by_reference.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1