Zend Framework: отчеты об ошибках выключаются независимо от ini-файла - PullRequest
2 голосов
/ 19 июля 2011

Я часто сталкиваюсь с проблемой, когда переменные / атрибуты имеют неправильный тип.Проблема в том, что это трудно отследить, поскольку мой PHP (5.3) просто падает, не выдает ошибку и даже не записывает в журнал ошибок (* 1).Он просто падает.

Я думаю, что доступ к строке, такой как массив, не должен быть отслеживаемым, не так ли?Я имею в виду, что PHP не C правильно?

Есть ли способ изменить это поведение или какой-то лучший метод, чтобы обойти эту проблему?Помимо проверки каждой переменной везде и, следовательно, написания в 5 раз больше кода?

[Обновление] : Хорошо, если я упросту код за пределами Zend, похоже, он будет работать.Это должно быть как-то связано с Зендом.Хотя у меня есть все phpSettings, установленные в моем application.ini:

phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
phpSettings.error_reporting = "E_ALL|E_STRICT"

И код, вызывающий ошибку (, которая работает в песочнице, как я только что попробовал ), таков:

$prefix = (strpos($obj[3][1], 'videometa') !== false) ? "http://www7.example.org" : "http://www.example.org";

Где $ obj - строка json.

[Обновление 2] : Итак, я попытался повторить настройку php, используя ini_get прямо над моим кодом, и там написано error_reportingна E_ALL | E_STRICT, display_error включен и т. д.

Итак, это:

echo '<br/>ini_get = '.ini_get('display_errors').';';
echo '<br/>ini_get = '.ini_get('error_reporting').';';
echo '<br/>ini_get = '.ini_get('error_log').';';
echo '<br>$obj: ';
$obj = 'peter';
var_dump($obj);

echo '<br/>Now for the critical code:';
$prefix = (strpos($obj[MC_IMAGETYPE_VDT][1], 'videometa') !== false) ? "http://www7.example.org" : "http://www.example.org";

echo '<br/>It never shows this!';

Вынимает это:

ini_get = 1;
ini_get = E_ALL|E_STRICT;
ini_get = /Applications/MAMP/logs/php_error.log;
$obj: string(5) "peter"

Now for the critical code:

И затем останавливается.Есть идеи?

* 1.php.ini имеет display_errors = On и error_reporting = E_ALL и так далее.Все хорошо.

1 Ответ

3 голосов
/ 19 июля 2011

Я не думаю, что метод, который вы используете для установки отчета об ошибках, является правильным, вы устанавливаете его в строковое значение, когда оно должно быть числовым (или константой, такой как E_ALL, которая имеет числовое значение).Попробуйте просто:

phpSettings.error_reporting = E_ALL|E_STRICT

(т.е. без кавычек) или:

phpSettings.error_reporting = 32767

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

error_reporting(E_ALL);

также у вас есть:

$prefix = (strpos($obj[MC_IMAGETYPE_VDT][1], 'videometa') !== false) ? "http://www7.example.org" : "http://www.example.org";

, но $obj - это строка, к которой вы пытаетесь обратиться как к вложенному массиву.Это даст вам Fatal error: Cannot use string offset as an array, что, вероятно, является причиной сбоя вашего кода.

...