PHP 프로세스는 일반적으로 특정 사용자 (예 : www-data )로 실행되며 사용자가 파일을 삭제할 권한이없는 경우 Unlink ()가 실패합니다.
$file = '/var/www/html/uploads/temp.jpg';
if (!is_writable($file)) {
echo "쓸 수없는 파일,삭제할 수 없습니다。";
} else {
unlink($file);
}
해결책:
파일의 권한으로 PHP 사용자가 쓸 수 있는지 확인하십시오.
chmod ()를 사용하여 파일 권한을 수정하지만 보안에주의하십시오.
chmod($file, 0666); // 쓰기 가능한 권한으로 수정하십시오
Unlink ()는 존재하지 않는 파일을 삭제하려고 할 때 경고를합니다.
if (file_exists($file)) {
unlink($file);
} else {
echo "파일이 존재하지 않습니다。";
}
제안 : Unlink ()을 호출하기 전에 File_Exists () 를 확인하십시오.
일부 운영 체제 (특히 Windows)에서는 다른 프로세스에서 파일을 사용하는 경우 Unlink ()가 실패 할 수 있습니다.
해결책:
파일이 작성되거나 읽을 때 파일을 삭제하지 마십시오.
모든 파일 핸들을 닫습니다.
$fp = fopen($file, 'r');
// 사용 후
fclose($fp);
unlink($file);
상대 경로가 사용되거나 경로가 잘못된 경우 삭제가 실패 할 수도 있습니다.
제안 : 절대 경로를 사용하고 realpath ()를 사용하여 경로의 정확도를 확인하십시오.
$realPath = realpath($file);
if ($realPath && file_exists($realPath)) {
unlink($realPath);
}
각 삭제 작업의 성공 또는 실패 이유를 기록하여 디버깅 및 감사를 용이하게합니다.
$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");
}
파일을 삭제하기 전에 /tmp/delete_queue/ 와 같은 임시 디렉토리로 이동 한 다음 실수로 중요한 파일을 삭제하지 않도록 삭제를 비동기로 처리하십시오.
$src = '/var/www/html/uploads/file.jpg';
$dest = '/tmp/delete_queue/file.jpg';
if (rename($src, $dest)) {
// 백그라운드에서 비동기식 시간 청소 /tmp/delete_queue/ 파일
}
삭제가 실패하면 처리되지 않은 예외를 던지는 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 ()를 사용하여 직접 사용하는 복잡성과 위험을 줄이는 것이 좋습니다.