2009-07-30 2 views
9

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

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

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

Как я могу узнать, почему Еореп не удалось?

ответ

1

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

  • Если для отладки, вам нужно ВЫКЛЮЧИТЬ @ operator, вы можете установить scream extension- смотрите также the manual -, который является очень полезным, когда вы поддерживаете какое-то старое приложение не очень хорошо разработан/кодированный ^^
  • в зависимости от вашего PHP в Кoнфигурировании (если 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

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

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