현재 위치: > 최신 기사 목록> PHP 삭제 함수별로 파일을 삭제할 때 삭제 고장을 피하는 방법

PHP 삭제 함수별로 파일을 삭제할 때 삭제 고장을 피하는 방법

gitbox 2025-06-03

Unlink ()가 파일을 삭제하지 못하는 일반적인 이유

1. 불충분 한 권한

PHP 프로세스는 일반적으로 특정 사용자 (예 : www-data )로 실행되며 사용자가 파일을 삭제할 권한이없는 경우 Unlink ()가 실패합니다.

 $file = '/var/www/html/uploads/temp.jpg';
if (!is_writable($file)) {
    echo "쓸 수없는 파일,삭제할 수 없습니다。";
} else {
    unlink($file);
}

해결책:

  • 파일의 권한으로 PHP 사용자가 쓸 수 있는지 확인하십시오.

  • chmod ()를 사용하여 파일 권한을 수정하지만 보안에주의하십시오.

 chmod($file, 0666); // 쓰기 가능한 권한으로 수정하십시오

2. 파일이 존재하지 않습니다

Unlink ()는 존재하지 않는 파일을 삭제하려고 할 때 경고를합니다.

 if (file_exists($file)) {
    unlink($file);
} else {
    echo "파일이 존재하지 않습니다。";
}

제안 : Unlink ()을 호출하기 전에 File_Exists () 를 확인하십시오.

3. 파일이 점유되거나 잠겨 있습니다

일부 운영 체제 (특히 Windows)에서는 다른 프로세스에서 파일을 사용하는 경우 Unlink ()가 실패 할 수 있습니다.

해결책:

  • 파일이 작성되거나 읽을 때 파일을 삭제하지 마십시오.

  • 모든 파일 핸들을 닫습니다.

 $fp = fopen($file, 'r');
// 사용 후
fclose($fp);
unlink($file);

4. 상대 경로 또는 경로 오류를 사용하십시오

상대 경로가 사용되거나 경로가 잘못된 경우 삭제가 실패 할 수도 있습니다.

제안 : 절대 경로를 사용하고 realpath ()를 사용하여 경로의 정확도를 확인하십시오.

 $realPath = realpath($file);
if ($realPath && file_exists($realPath)) {
    unlink($realPath);
}

실제 예방 조치

1. 로그 레코드 삭제 작업

각 삭제 작업의 성공 또는 실패 이유를 기록하여 디버깅 및 감사를 용이하게합니다.

 $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("성공적으로 삭제하십시오: $file");
    } else {
        log_delete("삭제가 실패했습니다: $file");
    }
} else {
    log_delete("파일이 존재하지 않습니다: $file");
}

2. 임시 디렉토리를 사용하여 위험을 분리하십시오

파일을 삭제하기 전에 /tmp/delete_queue/ 와 같은 임시 디렉토리로 이동 한 다음 실수로 중요한 파일을 삭제하지 않도록 삭제를 비동기로 처리하십시오.

 $src = '/var/www/html/uploads/file.jpg';
$dest = '/tmp/delete_queue/file.jpg';
if (rename($src, $dest)) {
    // 백그라운드에서 비동기식 시간 청소 /tmp/delete_queue/ 파일
}

3. 오류 처리를 설정합니다

삭제가 실패하면 처리되지 않은 예외를 던지는 PHP 스크립트를 피하거나 @unlink () 또는 사용자 정의 오류 처리 기능을 사용하십시오.

 set_error_handler(function ($errno, $errstr) {
    echo "실수: $errstr";
});
@unlink('/var/www/html/uploads/test.jpg');
restore_error_handler();

예 : 보안 캡슐화 삭제 기능

경로 점검, 권한 판단, 로깅 및 오류 처리를 통합하는 보안 파일 삭제 함수를 만듭니다.

 function safe_delete($file) {
    $logFile = '/var/log/delete_log.txt';
    $file = realpath($file);

    if (!$file || !file_exists($file)) {
        file_put_contents($logFile, "파일이 존재하지 않습니다: $file\n", FILE_APPEND);
        return false;
    }

    if (!is_writable($file)) {
        file_put_contents($logFile, "삭제 허가가 없습니다: $file\n", FILE_APPEND);
        return false;
    }

    if (@unlink($file)) {
        file_put_contents($logFile, "성공적으로 삭제하십시오: $file\n", FILE_APPEND);
        return true;
    } else {
        file_put_contents($logFile, "삭제가 실패했습니다: $file\n", FILE_APPEND);
        return false;
    }
}

// 사용의 예
safe_delete('/var/www/html/uploads/avatar.jpg');

타사 파일 관리 미들웨어로 견고성을 향상시킵니다

프로젝트에 많은 파일 운영 요구가있는 경우 gitbox.net/api/filesystem 과 같은 미들웨어 서비스를 사용하여 허가 제어, 삭제 및 롤백, 로그 녹음 등을 포함한 모든 파일 작업을 중앙에서 처리하여 Unlink ()를 사용하여 직접 사용하는 복잡성과 위험을 줄이는 것이 좋습니다.