أتساءل لماذا لا يتم مناقشة هذا على نطاق أوسع؟ هذه مشكلة كبيرة حقًا.
لقد كتبت برنامج PHP، والذي يستخدم ملف CSV تم إنشاؤه من استعلام SQL التالي الذي يسرد جميع التحميلات ومراجعها:
(قم بزيادة الحد إذا كان لديك الكثير من التحميلات)
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()).
ثم قم بتسجيل الدخول إلى خادم SSH الخاص بك في Discourse وقم بتنفيذ أمر 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++; //taisa i++, kad nav tikai drafts
}
if($i==0)array_push($final, $item[4]); //bija tikai drafti, var likt masiivaa
$i=0;
}
}
$final_unique= array_unique($final);
//print_r($final_unique);
foreach($final_unique as $single){
echo basename($single)." ";
}
?>
يجب وضع الملف test.csv الذي يحتوي على الاستعلام في نفس الدليل الذي يوجد به البرنامج.
إذا كانت لديك أي مشاكل، اسألني!