不允许 PHP 代码覆盖 php.ini error_reporting
Disallow PHP code overriding php.ini error_reporting
我可以禁止 PHP 覆盖 php.ini
error_reporting 设置吗?并且仅从 php.ini
.
中获取此设置
php.init file have: error_reporting = E_ERROR|E_PARSE
PHP code have: error_reporting(E_WARNING|E_PARSE);
但这 PHP 行在项目核心中,我无法编辑它,我不需要 E_WARNING
。
Can i disallow PHP override php.ini error_reporting settings?
您可以使用 disable_functions 配置指令禁止在您的代码中使用 error_reporting()
函数。缺点是你不能
disable_functions = error_reporting
每个 vhost 设置(即通过 php_admin_value
),但必须在 main php.ini
中设置,这在某些配置中可能会出现问题。
另外我认为你的问题暴露了不同的问题,你不是在这里修复它,而是解决它。
编辑:我刚想到,你可以使用 php 运行kit 来做这个而不是弄乱源代码,
选项 1:
安装 运行kit ( https://github.com/zenovich/runkit / https://github.com/runkit7/runkit7 ),在 php.ini 中添加 runkit.internal_override=1
,然后 运行
runkit_function_rename("error_reporting","original_error_reporting");
runkit_function_add("error_reporting",function(int $ignored = NULL){return original_error_reporting();});
在 运行 设置你想要的代码之前(你也可以将这段代码添加到 auto_prepend_file
php.ini 选项指向的文件中以确保它 运行s在任何其他代码之前)
- 或选项 2:编辑 php 解释器源代码,
在php-src/Zend/zend_builtin_functions.c中找到
/* {{{ proto int error_reporting([int new_error_level])
Return the current error_reporting level, and if an argument was passed - change to the new level */
ZEND_FUNCTION(error_reporting)
然后在那个正下方找到
if (ZEND_NUM_ARGS() != 0) {
替换为
if (0) {
然后重新编译 PHP,瞧,error_reporting 参数被忽略了:)
在 git 修订版 ab8094c666048b747481df0b9da94e08cadc4160 中,即 7.3.0-dev(稍晚于 7.3.0-beta1),它在第 736 行,参见 https://github.com/php/php-src/blob/ab8094c666048b747481df0b9da94e08cadc4160/Zend/zend_builtin_functions.c#L736
我可以禁止 PHP 覆盖 php.ini
error_reporting 设置吗?并且仅从 php.ini
.
php.init file have: error_reporting = E_ERROR|E_PARSE
PHP code have: error_reporting(E_WARNING|E_PARSE);
但这 PHP 行在项目核心中,我无法编辑它,我不需要 E_WARNING
。
Can i disallow PHP override php.ini error_reporting settings?
您可以使用 disable_functions 配置指令禁止在您的代码中使用 error_reporting()
函数。缺点是你不能
disable_functions = error_reporting
每个 vhost 设置(即通过 php_admin_value
),但必须在 main php.ini
中设置,这在某些配置中可能会出现问题。
另外我认为你的问题暴露了不同的问题,你不是在这里修复它,而是解决它。
编辑:我刚想到,你可以使用 php 运行kit 来做这个而不是弄乱源代码,
选项 1:
安装 运行kit ( https://github.com/zenovich/runkit / https://github.com/runkit7/runkit7 ),在 php.ini 中添加 runkit.internal_override=1
,然后 运行
runkit_function_rename("error_reporting","original_error_reporting");
runkit_function_add("error_reporting",function(int $ignored = NULL){return original_error_reporting();});
在 运行 设置你想要的代码之前(你也可以将这段代码添加到 auto_prepend_file
php.ini 选项指向的文件中以确保它 运行s在任何其他代码之前)
- 或选项 2:编辑 php 解释器源代码,
在php-src/Zend/zend_builtin_functions.c中找到
/* {{{ proto int error_reporting([int new_error_level])
Return the current error_reporting level, and if an argument was passed - change to the new level */
ZEND_FUNCTION(error_reporting)
然后在那个正下方找到
if (ZEND_NUM_ARGS() != 0) {
替换为
if (0) {
然后重新编译 PHP,瞧,error_reporting 参数被忽略了:)
在 git 修订版 ab8094c666048b747481df0b9da94e08cadc4160 中,即 7.3.0-dev(稍晚于 7.3.0-beta1),它在第 736 行,参见 https://github.com/php/php-src/blob/ab8094c666048b747481df0b9da94e08cadc4160/Zend/zend_builtin_functions.c#L736