Как вывести причину сбоя при открытии PHP-файла
-
05-07-2019 - |
Вопрос
Я пытаюсь отладить огромный устаревший (около 2001 года) веб-сервис PHP и сталкиваюсь с ошибками при открытии файлов.Вызов fopen выполняется во включенном модуле, вызывающий регистрирует, что файл не удалось открыть, но причина не регистрируется.
Код, который на самом деле делает открытие, является:
// Read the file
if (!($fp = @fopen($fileName, 'rb'))) {
$errStr = "Failed to open '{$fileName}' for read.";
break; // try-block
}
Как я могу узнать, почему произошел сбой fopen?
Решение
Уже были даны замечательные ответы о @ оператор, но вот еще пара сведений, которые могут быть полезны либо вам, либо кому-то другому :
- Если для целей отладки вам необходимо отключить
@ 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)
Итак, реальные, полезные, значимые сообщения об ошибках ;-)
Другие советы
Уберите знак @.
Знак @ подавляет сообщения об ошибках, поэтому он подавляет ошибку, которую обычно выдает функция.
Удалите подавитель ошибок .