【问题标题】:PHP suppress warning with the @ character not working on command linePHP 禁止使用 @ 字符在命令行上不起作用的警告
【发布时间】:2019-09-12 09:57:55
【问题描述】:

我的 php 脚本中有一个外部包含文件,在浏览器中执行它时会触发警告。所以我在它前面放了一个@字符,非常好,现在警告不再发生了。我的问题是,如果我现在在 CLI 上执行脚本,则不会抑制警告。我怎样才能抑制 CLI 的警告?

这是一个运行 PHP 7.3 的新 VPS。

@include_once('externalsourcefile.php');

结果是:

警告:““continue”定位开关等同于“break”。您的意思是使用“continue 2”吗?”在第 xx 行 (externalsourcefile.php)

更新:关键是包含文件是一个外部源,我无法编辑它以自行解决警告。

【问题讨论】:

  • 我个人会删除@ - 它的用途是空的,为什么要抑制开发中的错误?
  • "在浏览器中执行时会触发警告。" 解决警告而不是隐藏它
  • 为什么不在第 2 行解决问题? :-D
  • @ 抑制该特定函数调用的警告,而不是后续的警告(因此在您的示例中,仅在 include_once 上,而不是该文件中的内容)。也就是说,真的不推荐使用抑制运算符 - 始终修复错误并正确处理它们,否则有一天它会咬你一口。跨度>
  • 使用@警告抑制不是一个好习惯!我的建议是你应该重写包含代码

标签: php


【解决方案1】:

您必须参考https://www.php.net/manual/en/function.include-once.php#84108,它会让您了解 include_once 的工作原理。你必须尽快删除@,不好的做法!

if(include_once('externalsourcefile.php') == false) {
} else {
}

【讨论】:

    【解决方案2】:

    @ 抑制该语句的警告,在您的情况下是实际的include_once,而不是其中发生的内容。

    我写这个是为了回答,因为太长了,不能发表评论。说@ 应该永远被使用是错误的。 不假思索地使用它这是错误的。

    考虑在繁忙的多进程环境中运行这个简单的代码:

    clearstatcache(true, $pathname);
    if(is_dir($pathname) && $dh=opendir($pathname)) {
       // readdir() loop here
    }else{
       // error handling here
    }
    

    此代码有一个竞态条件。对我来说,在is_dir() return 和 opendir() 调用之间目录消失了很多次,导致控制台上出现警告:

    PHP Warning:  opendir(/the/path/in/use): failed to open dir: No such file or directory in /path/to/script.php on line 2
    

    我问你,如果不禁用来自opendir() 的警告,如何解决这场比赛?

    全局禁用恕我直言比对特定语句(如上面的opendir() 调用)更糟糕。

    【讨论】:

    • @Qirel,有没有关于这个的 cmets?
    【解决方案3】:

    如前所述,错误不是由include_once 语句本身引起的,而是由包含文件中运行的代码引起的(您可以通过仔细阅读错误消息来确定)。

    无论如何,它应该工作。一定有别的事情发生了。

    我能想到三种可能:

    1. 您的 VPS 中的 CLI 解释器配置为使用不支持 error suppression operatorcustom error handler

      除非回调函数返回FALSE,否则对于由error_types 指定的错误类型,标准的PHP 错误处理程序将被完全绕过。 error_reporting() 设置将不起作用,并且无论如何都会调用您的错误处理程序 - 但是您仍然能够读取 error_reporting 的当前值并采取适当的行动。需要特别注意的是,如果导致错误的语句由 @error-control 运算符添加,则该值将为 0。

    2. 解释器已配置为调试,Xdebug 已设置为xdebug.scream directive

      如果此设置为 1,则 Xdebug 将禁用 @(关闭)运算符,以便不再隐藏通知、警告和错误。

    3. 浏览器解释器运行的是较早的 PHP 版本,然后是 CLI 版本。 "continue" targeting switch is equivalent to "break" warning 是 PHP/7.3 中向后不兼容的更改。它之前没有触发警告。

    在任何一种情况下,如前所述,问题本身说明了抑制错误会导致难以诊断的错误。

    【讨论】:

      猜你喜欢
      • 2016-02-24
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      相关资源
      最近更新 更多