【问题标题】:PHP/Zend: How to force browsers to don't show warnings on webpage for a particular case?PHP/Zend:如何强制浏览器在特定情况下不在网页上显示警告?
【发布时间】:2010-04-16 07:26:57
【问题描述】:

我正在尝试获取这样的推特更新:

try {

  $doc = new DOMDocument();
  $doc->load('http://twitter.com/statuses/user_timeline/1234567890.rss');
  $isOK = true;

} catch( Zend_Exception $e ) {
  $isOK = false;
}

如果互联网连接没有问题,则 $isOK = true;已设置。但是如果在加载 twitter 页面时出现问题,那么它会显示以下警告并且不会设置 $isOK = false;

警告:DOMDocument::load(http://twitter.com/statuses/user_timeline/1234567890.rss) [domdocument.load]:打开流失败:HTTP 请求失败! HTTP/1.1 404 Not Found in /var/www/vcred/application/controllers/IndexController.php on line 120

无论如何,我都不希望在我的网页上看到上述警告。有什么想法吗?

谢谢

【问题讨论】:

  • 与 ZF 完全无关,是吗?您使用的是 DOM,而不是 Zend_Service_Twitter。
  • 我在控制器/动作中使用DOM,因此我认为可能是zend try-catch有问题。
  • try/catch 对采埃孚来说也没什么特别的。见de2.php.net/manual/en/language.exceptions.php。您收到警告是因为: 如果将空字符串作为文件名传递或命名为空文件,则会生成警告。此警告不是由 libxml 生成的,无法使用 libxml 的错误处理函数进行处理。 - de2.php.net/manual/en/domdocument.load.php
  • 好的。反正。在不阻止所有警告的情况下,您对此问题有任何解决方案吗?

标签: php zend-framework warnings httprequest


【解决方案1】:

几个选项:

Suppress all errors for just this function call

@$doc->load('http://twitter.com/statuses/user_timeline/1234567890.rss');

相同
$oldLevel = error_reporting(0);
$doc->load('http://twitter.com/statuses/user_timeline/1234567890.rss');
error_reporting($oldLevel);

以这种方式抑制错误通常是不受欢迎的,因为它会使代码更难调试。就像 Shrapnel 指出的那样,无论如何,您都希望在生产系统上禁用所有错误消息的公开显示。在开发系统上,鼓励您使用error_reporting(-1);,这将启用E_ALLE_STRICT

如果你想使用try/catch,你也可以更改默认error handling,并通过这样做将所有错误转换为异常

function myErrorHandler($errno, $errstr, $errfile, $errline) {
    throw new Exception($errstr, $errno);
}
set_error_handler("myErrorHandler");

这是一个全球性的变化,会影响所有提出的问题。您还必须在代码中使用catch(Exception $e) 而不是Zend_Exception,但它会起作用。请注意,上述内容会转换所有内容,甚至是通知,因此如果您稍后尝试访问它,您还将收到关于 $isOk 未定义的异常。随意调整处理程序以适应您的喜好并查看user comments for set_error_handler for more refined versions

另一个全局更改是更改应用程序文件夹中的 application.ini,例如让 Zend Framework 控制错误处理:

phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

根据您的需要更改这些。它们与 PHP.ini 中的相同,例如

display_errors:

这决定了错误是否应该作为输出的一部分打印到屏幕上,或者是否应该对用户隐藏。

display_startup_errors:

即使 display_errors 开启,PHP 启动过程中发生的错误也不会显示。强烈建议关闭 display_startup_errors,调试除外。

【讨论】:

  • @Gordon 如何将您的答案添加到我的收藏夹中!? ;) 但是……你忘了写关于ini_set、.htaccess 和使用默认错误报告级别的源代码更改重新编译 PHP ;)
  • @takeshin 谢谢。我不认为我们可以喜欢答案。弹片已经提到ini_set 所以我没有。除非它包含新的恕我直言,否则重复别人所说的话是没有用的。此外,我的回答通常并不打算涵盖所有可能的解决方案。为其他答案留出空间:)
  • 考虑过将您的昵称更改为“PHP Community Wiki”吗? ;) 无论如何,感谢所有答案,它们总是很好的阅读材料。
【解决方案2】:
ini_set('display_errors',0);

在任何生产站点上都应该这样设置。
根本不应该允许用户看到系统错误消息

【讨论】:

  • 感谢它为我所做的工作。是的,此代码可用于避免单页错误或通知或警告,但将此代码放入控制器中。 :)
猜你喜欢
  • 2011-11-18
  • 2018-09-30
  • 2021-01-13
  • 1970-01-01
  • 2012-05-18
  • 2016-03-26
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多