我要调试一个巨大的、过时的(大约在2001)PHP网服务和我遇到的文件打开故障。Fopen call是在一个包含的模块,该呼叫者是日志记录,该文件可能不打开,但原因是没有被记录。

代码,实际上不会打开的是:

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

我怎么能找出为什么fopen失败?

有帮助吗?

解决方案

伟大的答复中已经给出的,有关 @operator, 但这里有一对夫妇的更多信息,可能是有用的,要么为您或其他人:

  • 如果为调试目的,需要禁止的 @ 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)

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

其他提示

带走@符号。

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

删除错误抑制器

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top