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

@ 演算子については、すでに優れた回答が提供されていますが、ここに、あなたまたは他の誰かにとって役立つ情報がいくつかあります。

  • デバッグ目的で を無効にする必要がある場合は、 scream 拡張機能@ 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 に答える