Đây là giải pháp của NEDKA ở vinabb
Ý tưởng là, phải so sánh filename của những file còn trong DB và những
file có trong thư mục files/ là sẽ biết được những "file rác" có trong
thư mục files/ (có trong files/ mà không có trong DB, nghĩa là không hề
được sử dụng đến. Cái này do rất nhiều nguyên nhân mà nó có, ví dụ:
thành viên upload file trong khi đang soạn dang dở, rồi bỏ không gửi ;
cấp phép sai thư mục files, dẫn đến không thể xóa file trong thư mục
vật lí...)
Đầu tiên là tạo danh sách những file có trong DB (đây là tất cả những file đang sử dụng - active). Tạo một file PHP như sau:
Code:
<?php
define('IN_PHPBB', true);
$phpbb_root_path = './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
// Start session management
$user->session_begin();
$auth->acl($user->data);
$user->setup();
$sql = 'SELECT physical_filename
FROM ' . ATTACHMENTS_TABLE . '
WHERE is_orphan = 0
ORDER BY physical_filename ASC';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
echo($row['physical_filename'] . '<br />');
}
?>
Upload lên host rồi chạy nó từ trình duyệt, copy tất cả kết quả xuất ra rồi save thành file FILE_DB.txt để trên máy.
Tiếp
theo, tạo tiếp file php khác để xuất ra tất cả các file hiện có trong
thư mục files/ (mà nhiều cái chắc chắn sẽ không còn trong DB - nghĩa là
"file rác"). Mấu chốt là do các file đính kèm của phpBB sau khi upload
đã không còn phần mở rộng (click từ trình duyệt nó sẽ hiểu nhầm là thư
mục con - do không có đuôi tập tin đi kèm), do đó phải dùng hàm
scandir - chỉ có trong PHP5 để hiện tên thực:
Code:
<?php
define('IN_PHPBB', true);
$phpbb_root_path = './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
$dir = $phpbb_root_path . 'files/';
$files = scandir($dir);
foreach ($files as $files_list => $file_ary)
{
printf($file_ary . '<br />');
}
?>
Upload lên host, chạy từ trình duyệt rồi copy kết quả thành file FILE_DIR.txt để trên máy.
Cuối cùng, dùng một phần mềm so sánh văn bản, như
WinMerge để so sánh 2 file này, bên trái là file FILE_DB.txt, bên phải là file DB_DIR.txt:
KẾT QUẢ KHI SO SÁNH:
Nếu
chỉ có bên phải, không có bên trái: nghĩa là những cái bên phải này là
file rác không hề sử dụng tới, hãy lưu lại tên nó rồi dò tìm và xóa đi
(xóa từ công cụ quản lý file trong hosting, qua FTP...).
Nếu chỉ có
bên trái, không có bên phải: trường hợp này nghĩa là có lỗi, 1 file có
trong DB (phần hồn) nhưng lại khộng có trong thư mục files (phần xác),
thành ra nếu ai đó click vào link download của nó sẽ báo lỗi "Not
found". Hãy tra tìm theo tên đó và upload lại.