Thông tin: Đây chỉ là nơi lưu dữ liệu cũ. Thao thác đăng nhập đã bị khóa. Vui lòng truy cập trang mới tại địa chỉ https://vinabb.vn/.

Làm sao xóa các file rác đính kèm trong thư mục files

Nơi bạn có thể gửi các yêu cầu trợ giúp khi sử dụng phpBB.

Điều hành viên: Support Team

Nội quy chuyên mục
1. Tìm kiếm trước khi đặt câu hỏi để tránh trùng lặp.
2. Mỗi chủ đề chỉ gửi một câu hỏi, bạn được phép tạo nhiều chủ đề nếu có nhiều câu hỏi.
3. Tên chủ đề vui lòng ghi rõ ràng, không chung chung hay “cầu cứu” ai đó.
4. Không đặt câu hỏi trong chủ đề của người khác nếu không cùng vấn đề.
5. Các câu hỏi trong chuyên mục này chỉ dành cho các chức năng sẵn có của bản phpBB gốc. Chuyển trang nếu bạn bạn hỏi về MOD hay giao diện.
6. Bật chế độ DEBUG (mở config.php và xóa dấu // trước 2 dòng cuối) khi gửi câu hỏi liên quan đến lỗi SQL.
Trả lời
Hình đại diện
hna_khoa
Nhóm hỗ trợ
Nhóm hỗ trợ
Bài viết: 97
Ngày tham gia: 23 Th.7 2007, 01:00
Giới tính: Nữ
Tên thật: Hà Ngọc Anh Khoa

Làm sao xóa các file rác đính kèm trong thư mục files

Bài viết bởi hna_khoa » 12 Th.11 2007, 19:37

Trong quá trình sử dụng, mình thấy số file trong thư mục files nhiều hơn tổng số tập tin đính kèm thống kê trong ACP. (không tính các file thumb___ gì đó). Thường khi xóa một lúc hàng loạt chuyên mục (mỗi chủ đề trong chuyên mục đều có file đính kèm) thì rất dễ nảy sinh nhiều file rác như thế. Mà file trong thư mục files dều không có đuôi đính kèm và được mã hóa file name cả. Cách nào để phát hiện file rác và xóa chúng?

Mấy cái này không phải trong phần "tập tin đính kèm không được sử dụng" của ACP, vì nó đã xóa khỏi DB trọn vẹn rồi, nhưng hình như file vật lý trong thư mục files vẫn còn.
Hình đại diện
nedka
Người sáng lập VinaBB
Người sáng lập VinaBB
Bài viết: 2866
Ngày tham gia: 30 Th.4 2006, 11:30
Giới tính: Nam
Nơi ở: $user->data['user_from']
Liên hệ:

Re: Làm sao xóa các file rác đính kèm trong thư mục files

Bài viết bởi nedka » 13 Th.11 2007, 12:01

Cái bạn này toàn hỏi những câu "trời ơi trả lời khổ quá"... :lol:

Ý 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:

Mã: Chọn hết

<?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:

Mã: Chọn hết

<?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:

WINMERGE.gif


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.

Tóm lại, công việc nãy giờ sẽ giúp ích bạn 2 việc: tìm xóa những file đính kèm dư thừa và kiểm tra có file nào đang sử dụng (trong DB) mà không có trên thực tế (thư mục files/) hay không.
٩(●̮̮̃●̃)۶٩(•̮̮̃•̃)۶٩(-̮̮̃-̃)۶٩(●̮̮̃•̃)۶٩(͡๏̯͡๏)۶٩(-̮̮̃•̃)۶
doviet
Đang tập cài phpBB
Đang tập cài phpBB
Bài viết: 13
Ngày tham gia: 13 Th.5 2008, 09:19
Giới tính: Nam
Liên hệ:

Re: Làm sao xóa các file rác đính kèm trong thư mục files

Bài viết bởi doviet » 14 Th.5 2008, 06:05

Trong PHP có hàm array_diff() để tìm ra các giá trị khác biệt giữa 2 arrays. Như thế, nếu lấy $array1 là danh sách tất cả các files liệt kê trong db, $array2 là danh sách tất cả các files có trên host, thì $array3 = array_diff($array1, $array2) là danh sách tên các files có trong db mà không có trên host, hoặc có trên host mà không có trong db. Dùng vòng lặp để xóa đống files có tên trong $array3 là được rồi. Như thế có được không anh Nedka?
Hình ảnh
Trả lời

Đang trực tuyến

Đang xem chuyên mục: 0 thành viên và 1 khách