Как вывести причину ошибки открытия файла PHP - PullRequest
9 голосов
/ 30 июля 2009

Я пытаюсь отладить огромный устаревший (около 2001 года) веб-сервис PHP и сталкиваюсь с ошибками открытия файлов. Вызов fopen находится во включенном модуле, вызывающая сторона регистрирует, что файл не может быть открыт, но причина не регистрируется.

Код, который фактически делает открытие:

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

Как я могу узнать, почему не удалось выполнить fopen?

Ответы [ 3 ]

9 голосов
/ 30 июля 2009

Уберите знак @.

Знак @ подавляет сообщения об ошибках, поэтому он подавляет ошибку, которую обычно выдает функция.

2 голосов
/ 30 июля 2009

Удалить подавитель ошибок .

1 голос
/ 30 июля 2009

Хорошие ответы уже были даны о @ операторе , но вот еще пара сведений, которые могут быть полезны вам или кому-то еще:

  • Если для отладки вам необходимо отключить @ operator, вы можете установить расширение scream - см. Также руководство - что действительно полезно, когда вы поддерживаете какое-то старое приложение, не очень хорошо разработанное / закодированное ^^
  • В зависимости от конфигурации 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)

Итак, реальные, полезные, содержательные сообщения об ошибках ; -)

...