2009-12-17 17 views
6

Làm thế nào để bạn tự động xóa tất cả các tệp trong thư mục con sau khi x-time (giả sử sau 24 giờ) - mà không cần sử dụng lệnh cronjob từ máy chủ hoặc pl. Làm thế nào bạn có thể làm điều này chỉ bằng cách sử dụng mã PHP hoặc chỉ cần truy cập vào trang mà không cần nhấp vào một cái gì đó và lệnh tự động chạy.Tự động xóa tất cả các tệp sau thời gian x

Trả lời

11

đáp ứng cho lời nhận xét cuối cùng từ câu trả lời đầu tiên của tôi. Tôi sẽ viết mẫu mã, vì vậy tôi đã tạo một câu trả lời khác thay vì thêm một bình luận nữa.

Để gỡ bỏ những file với phần mở rộng tùy chỉnh, bạn phải thực hiện các mã:

<?php 
    $path = dirname(__FILE__).'/files'; 
    if ($handle = opendir($path)) { 

    while (false !== ($file = readdir($handle))) { 
     if ((time()-filectime($path.'/'.$file)) < 86400) { // 86400 = 60*60*24 
      if (preg_match('/\.txt$/i', $file)) { 
      unlink($path.'/'.$file); 
      } 
     } 
    } 
    } 
?> 

Comment: 1. Ví dụ này sử dụng biểu thức chính quy /\.txt$/i, điều đó có nghĩa, mà chỉ có các file với phần mở rộng txt sẽ bị xóa. Ký hiệu '$' có nghĩa là tên tệp đó phải được kết thúc bằng chuỗi '.txt'. Gắn cờ 'i' cho biết, so sánh đó sẽ phân biệt chữ hoa chữ thường. Thông tin thêm về chức năng preg_match().

Bên cạnh đó bạn có thể sử dụng chức năng strripos() để tìm kiếm tệp có phần mở rộng nhất định. Dưới đây là đoạn mã:

<?php 
    $path = dirname(__FILE__).'/files'; 
    if ($handle = opendir($path)) { 

    while (false !== ($file = readdir($handle))) { 
     if ((time()-filectime($path.'/'.$file)) < 86400) { // 86400 = 60*60*24 
      if (strripos($file, '.txt') !== false) { 
      unlink($path.'/'.$file); 
      } 
     } 
    } 
    } 
?> 

Comment: Ví dụ này dường như rõ ràng hơn. Kết quả của strripos() cũng có thể đạt được với một sự kết hợp của hai chức năng: strrpos(strtolower($file), '.txt'), nhưng, IMHO, đó là một quy tắc tốt để sử dụng ít chức năng trong mã của bạn để làm cho nó dễ đọc hơn và nhỏ hơn. Vui lòng đọc kỹ cảnh báo trên trang của hàm strripos() (khối giá trị trả lại).

Một thông báo quan trọng khác: nếu bạn đang sử dụng hệ thống UNIX, việc xóa tệp có thể không thành công do quyền của tệp. Bạn có thể kiểm tra hướng dẫn sử dụng về chức năng chmod().

Chúc may mắn.

+2

Thay vì readdir + preg_match tại sao không chỉ sử dụng glob()? –

+0

Bạn nói đúng. Tôi đã không viết về glob() chức năng đơn giản chỉ vì tôi chưa bao giờ sử dụng nó trước :) Cảm ơn bạn đã bình luận của bạn. – Alex

+0

Lưu ý Alex và Thankyou rất nhiều – jones

7

Bạn có thể sử dụng các chức năng chính của PHP filectime()unlink() để kiểm tra thời gian tạo tệp và xóa tệp/tệp của nó.

EDIT. Mã dụ:

if ($handle = opendir('/path/to/files')) { 

    while (false !== ($file = readdir($handle))) { 
     if (filectime($file)< (time()-86400)) { // 86400 = 60*60*24 
      unlink($file); 
     } 
    } 
    } 
+0

Nó chỉ là bộ xương của hàm. Bạn có thể thêm bất kỳ điều kiện nào, ví dụ: tệp với các tiện ích mở rộng tùy chỉnh hoặc tệp, khớp với mẫu nhất định, v.v. – Alex

+0

cảm ơn bạn alex .... tôi hy vọng công việc này .. – jones

+0

Bạn được chào đón. Tôi rất vui khi được giúp đỡ bạn. Nếu câu trả lời này phù hợp với bạn, bạn có thể chấp nhận câu trả lời bằng cách nhấp vào dấu chọn gần câu trả lời của tôi. – Alex

0

tôi sử dụng vỏ AT lệnh, nó giống như một cronjob dù

php:

exec("echo rm /somedir/somefile.ext|at now +24 hours"); 
0

Dưới đây là một ví dụ sử dụng GLOB và nó sẽ xóa bất kỳ tập tin

$files = glob('path/to/your/files/*'); 

foreach($files as $file) { // iterate files 
    // if file creation time is more than 5 minutes 
    if ((time() - filectime($file)) > 3600) { // 86400 = 60*60*24 
     unlink($file); 
    } 
} 

hoặc nếu bạn muốn loại trừ một số tệp nhất định

$files = preg_grep('#\.txt#', glob('/path/to/your/files/*'), PREG_GREP_INVERT); 
2

Ở đây chúng ta đi, tập lệnh PHP xóa các tập tin đó là X số ngày cũ.

<? 
$days = 1; 
$dir = dirname (__FILE__); 

$nofiles = 0; 

    if ($handle = opendir($dir)) { 
    while (($file = readdir($handle)) !== false) { 
     if ($file == '.' || $file == '..' || is_dir($dir.'/'.$file)) { 
      continue; 
     } 

     if ((time() - filemtime($dir.'/'.$file)) > ($days *86400)) { 
      $nofiles++; 
      unlink($dir.'/'.$file); 
     } 
    } 
    closedir($handle); 
    echo "Total files deleted: $nofiles \n"; 
} 
?> 

Bây giờ dán mã này vào và lưu dưới dạng tệp php, tải tệp đó lên thư mục nơi bạn muốn xóa tệp.Bạn có thể thấy ở đầu mã php này

$days = 1; 

đặt số ngày, ví dụ nếu bạn đặt thành 2 ngày thì các tệp cũ hơn 2 ngày sẽ bị xóa. Về cơ bản đây là những gì sẽ xảy ra khi bạn chạy các kịch bản, được thư mục hiện hành và đọc các mục tập tin, bỏ qua '' cho thư mục và tiếp tục kiểm tra hiện hành nếu có bất kỳ thư mục khác,

if ($file == '.' || $file == '..' || is_dir($dir.'/'.$file)) { 
      continue; 
} 

nếu mục tập tin là không phải là một thư mục sau đó nó fetches các sửa đổi tập tin thời gian (thời gian sửa đổi lần cuối) và so sánh, nếu nó là số ngày cũ

if ((time() - filemtime($dir.'/'.$file)) > ($days *86400)) { 
      $nofiles++; 
      unlink($dir.'/'.$file); 
} 

nếu tình trạng này trở thành sự thật thì nó xóa các tập tin với sự giúp đỡ của unlink() php chức năng. Cuối cùng đóng thư mục và thoát. Tôi cũng đã thêm một bộ đếm để đếm số lượng tệp bị xóa, sẽ được hiển thị ở cuối quá trình xóa. Vì vậy, đặt tập tin php trong thư mục cần xóa tập tin và thực hiện nó.

Hy vọng rằng sẽ giúp :)

0
function deleteCachedData($hours=24) 
{ 
    $files = glob(ROOTDIR.DIRECTORY_SEPARATOR.'tmp'.DIRECTORY_SEPARATOR.'*.txt'); 
    foreach($files as $file) { 
     if(is_file($file) && (time() - filectime($file)) > $hours*3600) { 
      unlink($file); 
     } 
    } 

}

0

Sau khi cố gắng sử dụng các ví dụ này, tôi nhấn một vài vấn đề:

  1. Các toán tử so sánh nên lớn hơn, không ít hơn
  2. thời gian quay phim trả về thời gian đã sửa đổi. filectime là thời điểm dữ liệu inode của một tập tin được thay đổi; có nghĩa là, khi các điều khoản, chủ sở hữu, nhóm, hoặc siêu dữ liệu khác từ các inode được cập nhật, có thể dẫn đến kết quả bất ngờ

Tôi đã thay đổi ví dụ để sử dụng filemtime và cố định so sánh như sau:

<?php 
    $path = dirname(__FILE__).'/files'; 
    if ($handle = opendir($path)) { 

    while (false !== ($file = readdir($handle))) { 
     if ((time()-filemtime($path.'/'.$file)) > 86400) { // 86400 = 60*60*24 
      if (preg_match('/\.txt$/i', $file)) { 
      unlink($path.'/'.$file); 
      } 
     } 
    } 
    } 
?> 
Các vấn đề liên quan