2009-07-30 88 views
9

我试图调试一个巨大的,过时的(大约2001年)PHP Web服务,并遇到文件打开失败。 fopen调用位于一个包含的模块中,调用者正在记录该文件无法打开,但没有记录任何理由。如何输出PHP文件打开失败的原因

实际执行开放的代码是:

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

我怎样才能找出原因的fopen失败了?

回答

1

伟大的答案已经给出,有关@ operator,但这里的一对夫妇更多的信息,可能是有用的,无论是你或其他人:

  • 如果出于调试的目的,你需要禁用在@ operator,您可以安装scream extension- 又见the manual -这是当你保持某种旧的应用程序中没有得到很好的设计真正有用/编码^^
  • 根据你的PHP configuation (如果track_errors选项被激活),您可能可以使用$php_errormsg来获取最后一条错误消息。

考虑这段代码:

// This file doesn't exist 
if ([email protected]('/tmp/non-existant-file.txt', 'r')) { 
    var_dump($php_errormsg); 
} 

// My Apache server doesn't have the right to read this file 
if ([email protected]('/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) 

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

9

拿走@符号。

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