Отчет об ошибках в приложении CodeIgniter
Более короткое объяснение:
Я понял, что опубликовал это как действительно многословное объяснение - я оставил предыдущее объяснение ниже, но добавил более короткое резюме.
В моем приложении CodeIgniter уровень сообщения об ошибках установлен на 0. Если я пытаюсь сослаться на неопределенный индекс (например) в контроллере или представлении, не выводится ошибка, которая является ожидаемой.
Однако у меня есть библиотека, которая загружается в сторонний класс (NuSoap).
Если класс NuSoap обнаружит ошибку - он все равно выдаст ошибку в моем приложении.
Ошибки также будут выводиться, если ошибка обнаружена в самом файле библиотеки.
Почему это? Если он загружается через CodeIgniter, через библиотеку он должен наследовать уровень сообщений об ошибках?
Предыдущее (многословное) объяснение:
У меня возникли проблемы с пониманием того, как отчеты об ошибках работают в моем приложении CodeIgniter.
В index.php
мои сообщения об ошибках настроены следующим образом:
if (defined('ENVIRONMENT'))
{
switch (ENVIRONMENT)
{
case 'development':
error_reporting(E_ALL);
break;
case 'testing':
case 'production':
error_reporting(0);
break;
default:
exit('The application environment is not set correctly.');
}
}
Я использую производственную среду, поэтому ожидаемый результат при появлении сообщения об ошибке / предупреждении / уведомлении заключается в том, что ничего не отображается, но это не так.
Это заняло некоторое время, но я сделал несколько открытий.
Причина, по которой я понял это во время тестирования. Моя цель состояла в том, чтобы отследить любые ошибки при подключении к используемому нами API, к которому мы подключаемся с помощью клиента NuSoap.
Когда я изменил имя пользователя / пароль, чтобы сделать их намеренно неправильными, я обнаружил, что уведомления PHP выводятся из класса NuSoap - однако мой уровень сообщений об ошибках установлен на 0.
Ошибка в уведомлении PHP (неопределенный индекс)
У меня есть библиотека, которая включала основной класс NuSoap:
<?php
if(!defined('BASEPATH')) {
exit('No direct script access allowed');
}
class NuSoap {
var $nusoap_client;
public function __construct() {
/* Load the NuSoap class */
require_once('../httpdocs/application/libraries/nusoap/nusoap.php');
/* Initialise the NuSoap client */
$this->nusoap_client = new nusoap_client(NUSOAP_WSDL_FILE, 'wsdl', '', '', '', '', 120, 120);
/* Set the credentials */
$this->nusoap_client->set_credentials(USERNAME, PASSWORD);
$this->nusoap_client = $this->nusoap_client->getProxy();
}
}
?>
И ошибка исходит из включенного файла /application/libraries/nusoap/nusoap.php
В отдельном контроллере, который не использует библиотеку NuSoap, я поместил следующий код в функцию index:
$arr = array(); $arr['exists'] = true;
echo 'deliberate error - ' . $arr['not_exists'];
die(phpinfo());
Теперь, учитывая тот факт, что класс NuSoap выводит уведомление о неопределенной ошибке, я бы также ожидал, что вышеприведенное будет, но это не так.
Также - в выводе PHP Info для меня не имеет смысла следующее:
Directive Local Value Master Value
display_errors On On
Если display_errors включен - почему они здесь не выводятся?
Для подавления ошибок, генерируемых в nusoap.php
Я обнаружил, что выкладывать error_reporting(0)
в верхней части файла сделаем это. Я не могу понять, почему конфигурация отчетов об ошибках в CodeIgniter не влияет на этот файл, даже если он загружен библиотекой CodeIgniter?
1 ответ
Кажется, что это происходило только в библиотеке, когда другая библиотека была загружена до рассматриваемой библиотеки.
Библиотека, вызывающая проблему, была PHPGrid, которая настраивала display_errors
до 1.