If a call to unlink() returns false for the specified path, how do you find out what the reason for the failure was (i.e. EISDIR, ENOENT, ELOOP etc.)? PHP 5.x running on redhat
This is not possible, i'm afraid. Here's the C code that handles unlink in 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;
}
as you can see, errno is not returned and there's no way to access it later.
There's already a bugreport about this, but it doesn't seem to draw too much attention. ;)
See also this discussion
here's one way
unlink("/path/that/does/not/exist");
print_r(error_get_last());
See Error handling for more details
I don't think it is possible to get back any error code(s) issued by the system. That is maybe down to the fact that PHP is supposed to be portable, and different OS's have different methods of reporting errors.
You could of course do a exec('rm ....')
and get the error level back but that's not very portable, and makes your app depend on exec()
rights.
Otherwise, if you really, really need this, only a very hacky workaround comes to mind: Create a custom error handler function that tries to fetch the reason for the failure from the warning unlink
throws - e.g. check for "Permission denied", or just fetch the whole error message.
Create a wrapper function around unlink
that sets and re-sets the error handler. Something like this:
function my_unlink($file)
{
set_error_handler("my_error_handler");
unlink($file);
restore_error_handler();
}
you get my drift.
If anybody knows a better solution - I'd be interested to hear about it, too....