Ответ 1
здесь одним способом
unlink("/path/that/does/not/exist");
print_r(error_get_last());
Подробнее см. Обработка ошибок для более подробной информации
Если вызов unlink() возвращает false для указанного пути, как вы узнаете, в чем причина отказа (т.е. EISDIR, ENOENT, ELOOP и т.д.)? PHP 5.x работает на redhat linux.
здесь одним способом
unlink("/path/that/does/not/exist");
print_r(error_get_last());
Подробнее см. Обработка ошибок для более подробной информации
Я не думаю, что можно вернуть код ошибки, выданный системой. Возможно, это связано с тем, что PHP должен быть переносимым, а разные ОС имеют разные методы отчетности об ошибках.
Конечно, вы можете сделать exec('rm ....')
и получить уровень ошибки обратно, но не очень портативный, и ваше приложение зависит от прав exec()
.
В противном случае, если вам действительно нужно это, на ум приходит только очень хакерское обходное решение: создайте функцию обработчика ошибок > , который пытается извлечь причину отказа из предупреждения unlink
throws - например установите флажок "Разрешить отказ" или просто введите полное сообщение об ошибке.
Создайте оберточную функцию вокруг unlink
, которая устанавливает и повторно устанавливает обработчик ошибок. Что-то вроде этого:
function my_unlink($file)
{
set_error_handler("my_error_handler");
unlink($file);
restore_error_handler();
}
вы получите мой дрейф.
Если кто-то знает лучшее решение - мне было бы интересно услышать об этом тоже...
Это невозможно, я боюсь. Здесь C-код, который обрабатывает unlink в 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 не возвращается и нет доступа к нему позже.
Здесь уже есть bugreport, но, похоже, это не слишком привлекает внимание.;)
См. также обсуждение