如何输出 PHP 文件打开失败的原因

Posted

技术标签:

【中文标题】如何输出 PHP 文件打开失败的原因【英文标题】:How to output the reason for a PHP file open failure 【发布时间】:2010-11-15 12:11:21 【问题描述】:

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

实际打开的代码是:

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

如何找出 fopen 失败的原因?

【问题讨论】:

【参考方案1】:

去掉@符号。

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

【讨论】:

【参考方案2】:

删除error suppressor。

【讨论】:

【参考方案3】:

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

如果出于调试目的,您需要禁用@ operator,您可以安装scream extension --另请参阅the manual--,这在您维护时非常有用某种旧应用程序设计/编码不佳^^ 根据您的 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)

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

【讨论】:

以上是关于如何输出 PHP 文件打开失败的原因的主要内容,如果未能解决你的问题,请参考以下文章

php中echo输出问题,求助啊。。。。

php输出网页源代码莫名奇妙的多了一堆方框,导致ajax验证失败.

如何控制PHP文件中的Echo输出格式?

如何重新定义time()函数 PHP

使用 xampp,从 .php 文件中打开一个 .php 文件

HTML文件无法解析PHP