Запретить переопределение PHP-кода 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.


person lolalola    schedule 08.08.2018    source источник
comment
Зачем вам это нужно?   -  person Martin    schedule 08.08.2018


Ответы (2)


Могу ли я запретить PHP переопределять настройки php.ini error_reporting?

Вы можете запретить использование функции error_reporting() в своем коде с помощью disable_functions директива конфигурации. Недостатком является то, что вы не можете иметь

disable_functions = error_reporting

устанавливается для каждого виртуального хоста (то есть через php_admin_value), но он должен быть установлен в основном php.ini, что может быть проблематичным в некоторых конфигурациях.

Также я считаю, что ваш вопрос выявил другую проблему, и вы не исправляете ее здесь, а скорее работаете.

person Marcin Orlowski    schedule 08.08.2018

редактировать: только что пришло мне в голову, вы можете использовать php runkit, чтобы сделать это вместо того, чтобы возиться с исходным кодом,

вариант 1: установить runkit ( https://github.com/zenovich/runkit / https://github.com/runkit7/runkit7), добавьте runkit.internal_override=1 в php.ini и запустите

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, чтобы убедиться, что он запускается перед любым другим кодом)

  • или вариант 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/ab8094c666048b747481df0b9da94s6indc4160/Zend_builtin_function/Zend_builtin_functions4160/Zend/zend_builtin_functions.c#L736"

person hanshenrik    schedule 08.08.2018
comment
Это действительно плохая практика! Каждый раз, когда вы обновляете PHP, вам нужно думать об этой модификации. - person Edwin; 08.08.2018
comment
@SketchyCoder ну, мне только что пришло в голову, что вы можете использовать runkit вместо того, чтобы возиться с исходным кодом ... но все же, вероятно, не очень хорошая идея ¯\_(ツ)_/¯ - person hanshenrik; 08.08.2018
comment
Оба правда! ;-) Вопрос в том, зачем вам это вообще, это пахнет плохим дизайном. - person Edwin; 08.08.2018
comment
Я проголосовал за ваш ответ. Хотя это не самый чистый подход, я лично вижу ценность такого подхода в конкретных случаях. Так что людям полезно знать, что они могут пойти другим путем. Поэтому я считаю, что вы не заслуживаете никакого отрицательного голоса за то, что идете таким путем, поскольку ваш ответ определенно добавляет ценности здесь, а альтернативы всегда хороши. - person Marcin Orlowski; 08.08.2018