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
đá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.
Bạn có thể sử dụng các chức năng chính của PHP filectime() và 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);
}
}
}
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
cảm ơn bạn alex .... tôi hy vọng công việc này .. – jones
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
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");
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);
Ở đâ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 :)
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);
}
}
}
Sau khi cố gắng sử dụng các ví dụ này, tôi nhấn một vài vấn đề:
- Các toán tử so sánh nên lớn hơn, không ít hơn
- 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);
}
}
}
}
?>
- 1. Làm thế nào để xóa tất cả các ký tự sau một ký tự trong chuỗi?
- 2. Giữ x số lượng tệp và xóa tất cả các tệp khác - Powershell
- 3. Tệp tạm thời Java và xóa tự động
- 4. iPhone: Tất cả hoạt ảnh ngừng hoạt động sau một thời gian
- 5. Xóa các Tệp Tạm thời sau khi sử dụng
- 6. Cách xóa tất cả các số sau điểm trong PHP
- 7. Làm cách nào để xóa tất cả các khoảng thời gian?
- 8. git xóa tất cả các tệp đã xóa khỏi toàn bộ lịch sử
- 9. Java: loại bỏ tất cả các ký tự sau thời điểm
- 10. git cam kết xóa tất cả các tệp trong repo
- 11. Buộc xóa tất cả các tệp khỏi một thư mục
- 12. UIButton xóa tất cả các mục tiêu hành động
- 13. Cách xóa tất cả các thư mục có tên x trong thư mục bằng tệp cmd/batch
- 14. Xóa tất cả các tệp cho git commit?
- 15. Xóa tất cả các tệp git khỏi một thư mục?
- 16. TinyMCE: đóng gói tất cả các tệp thay vì tự động tải chúng ... có thể?
- 17. MySQL XÓA tất cả nhưng bản ghi X mới nhất
- 18. Xóa tất cả các hàng trong bảng
- 19. Cách xóa tất cả các tệp đã xóa khỏi kho lưu trữ?
- 20. Python: tự động tạo hàm tại thời gian chạy
- 21. Xóa tất cả các cam kết trong một chi nhánh sau khi cam kết nhất định
- 22. Xóa tất cả các ngắt dòng (BR)
- 23. Xóa tệp cũ hơn X phút
- 24. Tự động đo tất cả các truy vấn SQL
- 25. NSOutlineView - Tự động mở rộng tất cả các nút
- 26. preg_replace tất cả các không gian
- 27. VIM: Xóa tất cả các ký tự trước khi từ cụ thể cho tất cả các dòng trong một file
- 28. Cột dấu thời gian MYSQL tự động cập nhật ngay cả khi không có thay đổi?
- 29. Android: "Tự động làm mới" sau một thời gian nhất định
- 30. Xóa các dòng X đầu tiên khỏi một tệp PHP
Thay vì readdir + preg_match tại sao không chỉ sử dụng glob()? –
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
Lưu ý Alex và Thankyou rất nhiều – jones