【问题标题】:Zend Framework: Error Reporting is shut down regardless of ini FileZend 框架:无论 ini 文件如何,错误报告都会关闭
【发布时间】:2011-07-19 10:01:41
【问题描述】:

当变量/属性的类型错误时,我经常会遇到问题。问题是很难追踪,因为我的 PHP (5.3) 只是崩溃了,没有发出错误,甚至没有写入错误日志 (*1)。它只是崩溃。

我认为访问像数组这样的字符串不应该是不可追踪的吗?我的意思是,PHP 不是 C 对吗?

有没有办法改变这种行为或某种最佳实践来解决这个问题? 除了一直检查每个变量并因此编写 5 倍以上的代码吗?

[更新]: 好的,如果我在 Zend 之外简化代码,它似乎可以工作。它一定与 Zend 相关。虽然我确实在我的 application.ini 中设置了所有 phpSettings:

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]: 所以我尝试在我的代码上方使用 ini_get 回显 php 设置,它说 error_reporting 在 E_ALL|E_STRICT 上,display_error 是 ON 等。

所以这个:

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 等等。都很好。

【问题讨论】:

  • 你试过E_ALL|E_STRICT吗?
  • 你能发布一个遇到错误的例子吗?
  • “我认为访问像数组这样的字符串不应该是不可追踪的吗?我的意思是,PHP 不是 C 对吗?” - 您确实意识到使用数组下标语法访问字符串中的字符是完全合法的吗?即$a = "foobar"; $b = $a[1]; echo $b;会输出o
  • 理解为什么代码会停止。为什么它不输出错误是没有意义的。代码停止导致字符串只有一维可以解析。所以试图得到 [3][1] 确实是一个错误。但是我不知道为什么它没有输出任何错误...对不起...
  • 不,不是! : ) 顺便说一句......如果我执行我得到“致命错误:不能使用字符串偏移作为 C:\www\localhost\test.php 中的数组”。我正在使用 PHP 5.3.6。 error_reporting = E_ALL | E_STRICTdisplay_errors = Ondisplay_startup_errors = Onlog_errors =Ontrack_errors = On。请记住在设置值后重新启动您的网络服务器......我想我不必这么说......:D

标签: php zend-framework variables error-handling zend-config


【解决方案1】:

我不认为您用来设置错误报告的方法是正确的,当它应该是数字时,您将其设置为字符串值(或常量,例如具有数字值的 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,这可能就是你的代码失败的原因。

【讨论】:

  • 非常感谢,这一直是问题所在!我以某种方式混淆了常量和字符串,因为它在一个 ini 文件中,所以它根本没有 look 错误。谢谢!
猜你喜欢
  • 2013-03-03
  • 2011-07-20
  • 2011-07-08
  • 2013-09-15
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 2022-07-20
  • 2010-12-26
相关资源
最近更新 更多