不允许 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