9

我正在尝试调试一个巨大的、过时的(大约 2001 年)PHP Web 服务,但遇到文件打开失败。fopen 调用在包含的模块中,调用者正在记录文件无法打开但没有记录原因。

实际打开的代码是:

  // Read the file
  if (!($fp = @fopen($fileName, 'rb'))) {
    $errStr = "Failed to open '{$fileName}' for read.";
    break; // try-block
  }

如何找出 fopen 失败的原因?

4

3 回答 3

9

去掉@符号。

@ 符号抑制错误消息,因此它抑制了函数通常会给出的错误。

于 2009-07-30T16:02:51.767 回答
2

移除错误抑制器

于 2009-07-30T16:04:15.710 回答
1

关于@ 运算符,已经给出了很好的答案,但这里有一些对您或其他人可能有用的信息:

  • 如果出于调试目的,您需要禁用@ operator,您可以安装尖叫扩展 - 另请参阅手册-当您维护某种设计/编码不佳的旧应用程序时,这非常有用^^
  • 根据您的 PHP 配置(如果该track_errors选项已激活),您可能能够使用$php_errormsg来获取最后一条错误消息。

考虑到这段代码:

// This file doesn't exist
if (!@fopen('/tmp/non-existant-file.txt', 'r')) {
    var_dump($php_errormsg);
}

// My Apache server doesn't have the right to read this file
if (!@fopen('/tmp/vboxdrv-Module.symvers', 'w')) {
    var_dump($php_errormsg);
}

你会得到这个:

string 'fopen(/tmp/non-existant-file.txt) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: No such file or directory' (length=129)

string 'fopen(/tmp/vboxdrv-Module.symvers) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: Permission denied' (length=122)

所以,真实的、有用的、有意义的、错误信息;-)

于 2009-07-30T18:22:34.810 回答