PHP processes usually run as a specific user (for example, www-data ), and unlink() will fail if the user does not have permission to delete a file.
$file = '/var/www/html/uploads/temp.jpg';
if (!is_writable($file)) {
echo "File not writable,Unable to delete。";
} else {
unlink($file);
}
Solution:
Ensure that the permissions of the file allow PHP users to write.
Use chmod() to modify file permissions, but pay attention to security:
chmod($file, 0666); // Modify to writable permissions
Unlink() throws a warning when trying to delete a non-existent file.
if (file_exists($file)) {
unlink($file);
} else {
echo "The file does not exist。";
}
Suggestions: Before calling unlink() , be sure to check with file_exists() .
On some operating systems (especially Windows), unlink() may fail if a file is being used by another process.
Solution:
Avoid deleting the file when it is being written or read.
Close all file handles:
$fp = fopen($file, 'r');
// After use
fclose($fp);
unlink($file);
If relative paths are used or paths are misspelled, it may also cause deletion to fail.
Suggestion: Try to use absolute paths and use realpath() to check the accuracy of the path.
$realPath = realpath($file);
if ($realPath && file_exists($realPath)) {
unlink($realPath);
}
Record the reasons for success or failure of each deletion operation, which facilitates debugging and auditing.
$logFile = '/var/log/delete_log.txt';
function log_delete($message) {
file_put_contents($GLOBALS['logFile'], date('Y-m-d H:i:s') . ' - ' . $message . PHP_EOL, FILE_APPEND);
}
$file = '/var/www/html/uploads/image.jpg';
if (file_exists($file)) {
if (unlink($file)) {
log_delete("Delete successfully: $file");
} else {
log_delete("Deletion failed: $file");
}
} else {
log_delete("The file does not exist: $file");
}
Before deleting a file, move it to a temporary directory, such as /tmp/delete_queue/ , and then process the deletion asynchronously to avoid accidentally deleting important files.
$src = '/var/www/html/uploads/file.jpg';
$dest = '/tmp/delete_queue/file.jpg';
if (rename($src, $dest)) {
// Asynchronous timed cleaning in the background /tmp/delete_queue/ Files in
}
Avoid PHP scripts throwing unhandled exceptions when deletion fails, use @unlink() or custom error handling functions.
set_error_handler(function ($errno, $errstr) {
echo "mistake: $errstr";
});
@unlink('/var/www/html/uploads/test.jpg');
restore_error_handler();
Create a secure file deletion function that integrates path checking, permission judgment, logging and error handling.
function safe_delete($file) {
$logFile = '/var/log/delete_log.txt';
$file = realpath($file);
if (!$file || !file_exists($file)) {
file_put_contents($logFile, "The file does not exist: $file\n", FILE_APPEND);
return false;
}
if (!is_writable($file)) {
file_put_contents($logFile, "No permission to delete: $file\n", FILE_APPEND);
return false;
}
if (@unlink($file)) {
file_put_contents($logFile, "Delete successfully: $file\n", FILE_APPEND);
return true;
} else {
file_put_contents($logFile, "Deletion failed: $file\n", FILE_APPEND);
return false;
}
}
// Example of usage
safe_delete('/var/www/html/uploads/avatar.jpg');
If your project has a large number of file operation needs, it is recommended to use middleware services such as gitbox.net/api/filesystem to centrally handle all file operations, including permission control, deletion and rollback, log recording, etc., to reduce the complexity and risk of directly using unlink() .