在php中沉默E_DEPRECATED

Posted

技术标签:

【中文标题】在php中沉默E_DEPRECATED【英文标题】:Silence E_DEPRECATED in php 【发布时间】:2018-04-20 06:16:35 【问题描述】:

我有一个问题是在 php 中禁用显示已弃用的错误。 在我的项目中使用了很多不推荐使用的功能。这是一个非常大的项目,所以我目前无法用非弃用的 this 替换此功能。

对于这个功能: mcrypt_create_iv 正在抛出错误 ErrorException 并显示消息“不推荐使用函数 mcrypt_create_iv()”。

如何禁用它? 我尝试了很多方法,只有当error_reporting == 0时才不会抛出。

当报错时:

error_reporting(E_ALL ^ (E_DEPRECATED | E_USER_DEPRECATED | E_NOTICE | E_STRICT  | E_CORE_ERROR | E_PARSE | E_USER_NOTICE | E_RECOVERABLE_ERROR | E_WARNING | E_USER_WARNING | E_USER_ERROR | E_COMPILE_WARNING | E_CORE_WARNING | E_ERROR));

everythink 都在工作,但如果我只删除一个标志,我会在屏幕上看到错误。

你有什么想法吗?

我使用的是 PHP 7.1:

PHP 7.1.10 (cli) (built: Oct 10 2017 01:30:46) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.1.10, Copyright (c) 1999-2017, by Zend Technologies

【问题讨论】:

我建议您不要忽略已弃用的警告,因为这表明您正在使用的功能将来会被删除。 【参考方案1】:

首先,您的error_reporting() 配置对我来说似乎有点奇怪。您启用了E_ALL,但随后删除了所有内容?似乎最好只列出您想查看的内容,而不是排除所有内容。这可能是它如此敏感的原因之一。

其次,最好保持错误报告开启并调整other error-related settings。使错误仅在日志文件中可见以供您查看。见:http://php.net/manual/en/errorfunc.configuration.php

error_reporting=E_ALL
display_errors=no
log_errors=yes
error_log=/var/log/php/errors.log

最后,如果一切都失败了,您可以使用@ suppression 避免此警告。虽然这不是一个好主意,因为您会忘记这个问题的存在,并且最终在 PHP 的未来版本中,随着这个不推荐使用的函数被删除,这将完全中断。此外,通过抑制错误,您可能会错过比弃用警告更重要的其他问题。

@mcrypt_create_iv(...); // Suppress errors.
// Last-ditch, last resort. Refrain from using.

http://php.net/manual/en/migration71.deprecated.php

mcrypt 扩展已被废弃近十年,而且使用起来也相当复杂。因此,它已被弃用,取而代之的是 OpenSSL,它将在 PHP 7.2 中从核心中移除并进入 PECL。

【讨论】:

是的,我启用了 E_ALL 并禁用了所有测试。 @ 将抑制该调用可能引发的任何错误消息,而不仅仅是弃用通知。真是个坏主意。 在 7.0 中,使用 @ 转义函数不会抑制弃用警告。

以上是关于在php中沉默E_DEPRECATED的主要内容,如果未能解决你的问题,请参考以下文章

在沉默中保持精进

沉默特定异常

沉默是金

用袜子剥夺沉默

沉默聊数据测试重要性

沉默聊数据测试重要性