Получение значимой информации при сбое fopen() (PHP/suPHP)

Как мне получить что-то более значимое, чем «FALSE», когда я не могу открыть файл.

$myFile = "/home/user/testFile.txt"; 
$fh = fopen($myFile, 'w') or die("can't open file");

Когда я использую оператор die, клиенту возвращается can't open file, и он почти бесполезен. Если я его уберу, то ошибки не будет. Если я верну $fh, это будет FALSE. Я пробовал как локальное имя файла, так и абсолютное имя файла. Мой файл index.html находится в одной из подпапок моей папки с дырками. Кроме того, я использую suPHP с папкой, которую я пытаюсь записать, с разрешением 0755 (suPHP требует этого для всех папок).

Как мне выяснить, почему возникла проблема, или хотя бы запросить ее, прежде чем пытаться открыть файл.


person puk    schedule 05.11.2011    source источник
comment
Включить отчеты об ошибках?   -  person Josh    schedule 05.11.2011
comment
Я совсем забыл об этом. В верхней части моей страницы установлено значение error_reporting(E_ALL|E_STRICT);. Этого достаточно?   -  person puk    schedule 05.11.2011
comment
IIRC, если в php.ini не отключено отображение ошибок.   -  person mpartel    schedule 05.11.2011


Ответы (2)


fopen должен поднять E_WARNING в случае сбоя. См. error_get_last или set_error_handler(*), чтобы перехватить его. Кроме этого, вы можете использовать file_exists и is_readable, чтобы проверить, отсутствует ли файл или есть другая проблема (возможно, связанная с правами доступа).

(*) Я считаю хорошей практикой всегда устанавливать обработчик ошибок, который превращает все ошибки PHP в исключения.

person mpartel    schedule 05.11.2011
comment
Есть ли правильный способ передать исключения клиенту? Прямо сейчас я просто печатаю / повторяю их. - person puk; 05.11.2011
comment
@puk: это зависит от того, как вы разрабатываете свое приложение. Может быть просто уместно вернуть сообщение, некоторые хотят отображать всплывающие окна javascript, другие хотят отображать страницу с ошибкой и так далее и тому подобное. Я думаю, что наиболее важной частью является то, что у вас есть одно полезное сообщение об ошибке для пользователя и одно технически полезное сообщение об ошибке для разработчика, например. в журнал ошибок приложения. - person hakre; 05.11.2011
comment
будет ли эта ошибка отображаться на стороне клиента, на стороне сервера или это зависит от того, «как вы разрабатываете свое приложение»? - person puk; 05.11.2011
comment
Вы выбираете, где и как вы хотите показать свои ошибки. Часто люди показывают пользователю, что что-то пошло не так (кроме режима разработки), и регистрируют и/или отправляют по электронной почте реальную ошибку. Но не усложняйте преждевременно :) - person mpartel; 05.11.2011

Используйте error_get_last(), чтобы поймать (подавленные) ошибки в php:

$f = @fopen("x", "r") or die(print_r(error_get_last(),true));
person deejayy    schedule 05.11.2011
comment
Какова цель «@» здесь, я никогда раньше этого не видел. - person puk; 21.11.2011
comment
Символ @puk@ является оператором контроля ошибок. Он подавляет любые ошибки, выдаваемые этой функцией. В конце концов, это означает, что в случае сбоя функции вы не увидите никаких ошибок, связанных с ней, на экране или в ваших журналах. Это плохая практика, и ее следует избегать. Вы всегда можете настроить собственный обработчик ошибок для обнаружения ошибок. - person Raul; 07.10.2020