Как добраться, ошибочный результат удаляют связь

Если вызов для удаления связи () возвращает false для указанного пути, как Вы узнаете то, чем причина отказа была (т.е. EISDIR, ENOENT, ELOOP и т.д.)? PHP 5.x работающий на Redhat Linux.

14
задан Jammie Podger 25 February 2010 в 09:47
поделиться

3 ответа

вот один способ

unlink("/path/that/does/not/exist");
print_r(error_get_last());

Подробнее см. Обработка ошибок

20
ответ дан 1 December 2019 в 12:26
поделиться

Боюсь, это невозможно. Вот код C, который обрабатывает разъединение в php 5.3.

ret = VCWD_UNLINK(url); <-- calls unlink(2)
if (ret == -1) {
    if (options & REPORT_ERRORS) {
        php_error_docref1(NULL TSRMLS_CC, url, E_WARNING, "%s", strerror(errno));
    }
    return 0;
}

Как видите, errno не возвращается, и нет возможности получить к нему доступ позже.

Об этом уже есть отчет об ошибке , но, похоже, он не привлекает слишком много внимания. ;)

См. Также это обсуждение

1
ответ дан 1 December 2019 в 12:26
поделиться

Я не думаю, что можно получить обратно какой-либо код ошибки, выданный системой. Возможно, это связано с тем, что PHP должен быть переносимым, а разные ОС имеют разные методы сообщения об ошибках.

Конечно, вы можете выполнить exec('rm ....') и получить уровень ошибок обратно, но это не очень переносимо, и заставляет ваше приложение зависеть от прав exec().

В противном случае, если вам это очень-очень нужно, на ум приходит только очень хитрый обходной путь: создать пользовательскую функцию-обработчик ошибок которая пытается получить причину неудачи из предупреждения unlink - например, проверить на "Permission denied", или просто получить все сообщение об ошибке.

Создайте функцию-обертку вокруг unlink, которая устанавливает и переустанавливает обработчик ошибок. Что-то вроде этого:

function my_unlink($file)
 {
     set_error_handler("my_error_handler");
     unlink($file);
     restore_error_handler();

 }

вы поняли мою мысль.

Если кто-то знает лучшее решение - мне тоже было бы интересно узнать о нем....

2
ответ дан 1 December 2019 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: