Auto purge uploads from old deleted posts

왜 이 문제가 더 널리 논의되지 않는지 궁금합니다. 정말 큰 문제입니다.

다음 SQL 쿼리로 생성된 CSV 파일을 사용하는 PHP 스크립트를 작성했습니다. 이 쿼리는 모든 업로드와 해당 참조를 나열합니다:
(업로드가 많다면 limit 값을 늘리세요)

SELECT 
    uploads.original_filename,
    ROUND(uploads.filesize / 1000000.0, 2) AS size_in_mb,
    uploads.extension,
    uploads.created_at,
    uploads.url,
    upload_references.upload_id,
    upload_references.target_id,
    upload_references.target_type,
    upload_references.created_at,
    upload_references.updated_at
FROM upload_references
JOIN uploads ON uploads.id = upload_references.upload_id
ORDER BY upload_references.target_type
LIMIT 90000

이 스크립트는 초안으로만 남아 있는 업로드를 필터링합니다. (제가 여기에서 설명했듯이, 이는 데이터베이스에 잘못 남아 있는 것입니다.) 스크립트는 모든 파일 이름을 공백으로 구분된 문자열로 출력합니다. 스크립트를 수정하여 전체 경로도 출력할 수 있습니다(basename() 함수를 제거하면 됩니다).

그 다음 discourse SSH 서버에 로그인하여 모든 파일에 대해 rm 명령을 실행하세요.

  • 이 방법의 한 가지 단점은 활성 초안에 남아 있는 모든 이미지도 함께 삭제된다는 것입니다(하지만 n일 이상 지난 초안 삭제 설정을 낮추면 이를 제한할 수 있습니다).
  • 두 번째 단점은 잘못된 데이터베이스 항목이 여전히 남아 있다는 것입니다. 이에 대해서는 개발팀에 수정을 요청해야 합니다.

잘못된 항목이 삭제되면 문제가 제대로 해결되어야 합니다.

<?php
 
if (($open = fopen("test.csv", "r")) !== false) {
    while (($data = fgetcsv($open, 100000, ",")) !== false) {
        $array[] = $data;
    }
 
    fclose($open);
}
$final = array();
$i=0;
foreach ($array as $item){
	if($item[7]=="Draft"){
			foreach ($array as $item_inside){
				if(($item_inside[4]==$item[4]) && ($item_inside[7]!="Draft")) $i++; //초안이 아닌 항목이 있는지 확인
				}
			if($i==0)array_push($final, $item[4]); //초안만 있었던 경우 배열에 추가
			$i=0;
		}
	}
$final_unique= array_unique($final);
//print_r($final_unique);

foreach($final_unique as $single){
	echo basename($single)." ";
	}
?>

쿼리 결과를 담은 test.csv 파일은 스크립트와 같은 디렉터리에 있어야 합니다.
문제가 있으면 저에게 질문해 주세요!

3개의 좋아요