Current Location: Home> Latest Articles> How to avoid deletion failure when deleting a file by PHP delete function

How to avoid deletion failure when deleting a file by PHP delete function

gitbox 2025-06-03

Common reasons why unlink() fails to delete files

1. Insufficient permissions

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

2. The file does not exist

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() .

3. Files are occupied or locked

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);

4. Use relative paths or path errors

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);
}

Practical preventive measures

1. Log record deletion operation

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");
}

2. Use temporary directories to isolate risks

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
}

3. Set up error handling

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();

Example: Secure Encapsulation Delete Function

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');

Improve robustness with third-party file management middleware

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() .