2010-02-05 8 views
20

मेरे पास एक कैश फ़ोल्डर है जो HTML फ़ाइलों को संग्रहीत करता है। आवश्यकता होने पर उन्हें ओवरराइट किया जाता है, लेकिन बहुत समय, शायद ही कभी इस्तेमाल किए गए पृष्ठों को भी कैश किया जाता है, जो अंतरिक्ष का उपयोग करके समाप्त होता है (5 सप्ताह के बाद, ड्राइव 2.7 मिलियन कैश फाइलों से भरा हुआ था)।php में निर्माण तिथि के आधार पर निर्देशिका से फ़ाइलों को कैसे हटाएं?

क्या ऐसी निर्देशिका के माध्यम से लूप का सबसे अच्छा तरीका है जिसमें कई सैकड़ों फाइलें हैं, और 1 दिन से अधिक पुरानी फ़ाइलों को हटा दें?

+4

क्या कोई कारण है कि आपको PHP में ऐसा करने की आवश्यकता क्यों है? आपको इसके लिए एक शेल-स्क्रिप्टिंग भाषा अधिक उपयुक्त मिल सकती है। –

+0

आप [Linux 'find' command] (https://askubuntu.com/a/589224/372950) – rinogo

उत्तर

37

मुझे लगता है कि आप इसके बारे में जा सकते हैं इस readdir साथ निर्देशिका के माध्यम से पाशन और टाइमस्टैम्प के आधार पर हटा द्वारा:

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

    while (false !== ($file = readdir($handle))) { 
     $filelastmodified = filemtime($path . $file); 
     //24 hours in a day * 3600 seconds per hour 
     if((time() - $filelastmodified) > 24*3600) 
     { 
      unlink($path . $file); 
     } 

    } 

    closedir($handle); 
} 
?> 

if((time() - $filelastmodified) > 24*3600) 24 घंटे (24 घंटे बार प्रति घंटे 3600 सेकंड) पुरानी फ़ाइलों का चयन करेंगे। यदि आप दिन चाहते थे, तो इसे एक सप्ताह से पुरानी फ़ाइलों के लिए उदाहरण के लिए 7 * 24 * 3600 पढ़ना चाहिए।

यह भी ध्यान दें कि filemtime निर्माण तिथि के बजाय फ़ाइल के अंतिम संशोधन का समय लौटाता है।

4

नीचे समारोह उनके निर्माण तिथि के आधार पर फ़ाइल को सूचीबद्ध करता है:

private function listdir_by_date($dir){ 
    $h = opendir($dir); 
    $_list = array(); 
    while($file = readdir($h)){ 
    if($file != '.' and $file != '..'){ 
     $ctime = filectime($dir . $file); 
     $_list[ $file ] = $ctime; 
    } 
    } 
    closedir($h); 
    krsort($_list); 
    return $_list; 
} 

उदाहरण:

$_list = listdir_by_date($dir); 

अब आप सूची के माध्यम से पाश उनकी तारीखों और तदनुसार नष्ट करने के लिए कर सकते हैं:

$now = time(); 
$days = 1; 
foreach($_list as $file => $exp){ 
    if($exp < $now-60*60*24*$days){ 
    unlink($dir . $file); 
    } 
} 
3

SplIterators

// setup timezone and get timestamp for yesterday 
date_default_timezone_set('Europe/Berlin'); // change to yours 
$yesterday = strtotime('-1 day', time()); 

// setup path to cache dir and initialize iterator 
$path  = realpath('/path/to/files'); // change to yours 
$objects = new RecursiveIteratorIterator(
       new RecursiveDirectoryIterator($path)); 

// iterate over files in directory and delete them 
foreach($objects as $name => $object){ 
    if ($object->isFile() && ($object->getCTime() < $yesterday)) { 
     // unlink($object); 
     echo PHP_EOL, 'deleted ' . $object; 
    } 
} 

Creation Time is only available on Windows.

9

प्रयास करें यह

if((time()-$filelastmodified) > 24*3600 && is_file($file)) 

. और .. निर्देशिकाओं के लिए त्रुटियों से बचने के होना चाहिए।

+1

का उपयोग करके यह सब कुछ और अधिक कर सकते हैं यह जांचने के लिए बेहतर है कि '$ file =='। || $ file == '..' ''__ile()' हर बार जांचने से बचाने के लिए ... – barell

-1

@ पवेल के समाधान को बदलकर मैंने नीचे फ़ंक्शन बनाया। सबसे पहले मैं फ़ाइल नाम में "पथ" जोड़ना भूल गया, जो पता लगाने के लिए मेरा आधा घंटा लेता है।

public function deleteOldFiles ($hours=24) { 
    $path='cache'.DS; 
    if ($handle = opendir($path)) { 
     while (false !== ($file = readdir($handle))) { 
      $filelastmodified = filemtime($path.$file); 
      if((time()-$filelastmodified) > 24*3600 && is_file($path.$file)) 
      { 
       unlink($path.$file); 
      } 
     } 
     closedir($handle); 
    } 
} 
0

सिर्फ नोट करने के लिए गॉर्डन समय की तुलना (ऊपर देखें: https://stackoverflow.com/a/2205833/1875965) केवल सही जब 'दिन' के बजाय '24 घंटे 'की तुलना में है, नहीं सभी दिन 24 घंटे (गर्मियों/सर्दियों आदि) के रूप में ।

उदा।

// setup timezone and get timestamp for yesterday 
date_default_timezone_set('Europe/Berlin'); // change as appropriate 
$yesterday = strtotime('-1 day', time()); 

फ़ाइल दिनांक की तुलना करते समय उपयोग करें।

यह एक बड़ा मुद्दा नहीं हो सकता है, लेकिन जब आप सप्ताह/महीनों के साथ काम कर रहे हों तो अप्रत्याशित व्यवहार कर सकते हैं। मुझे उपर्युक्त विधि का उपयोग करने के लिए चिपकना अच्छा लगता है क्योंकि यह किसी भी प्रक्रिया को दिनांक/बार लगातार संगत और भ्रम से बचें।

यह भी जांचें कि फ़ाइल तिथियों के लिए टाइमज़ोन क्या है, कभी-कभी PHP के लिए डिफ़ॉल्ट सिस्टम टाइमज़ोन से अलग होता है।

दयालु संबंध, सैंड्रा।

+0

अच्छा बिंदु। लंबी अवधि के लिए, टाइमज़ोन पर विचार करना चाहिए। । । – Atara

1
/* Detele Cache Files Here */ 
$dir = "cache/"; /** define the directory **/ 

/*** cycle through all files in the directory ***/ 
foreach (glob($dir."*") as $file) { 
//foreach (glob($dir.'*.*') as $file){ 

/*** if file is 24 hours (86400 seconds) old then delete it ***/ 
if (filemtime($file) < time() - 3600) { // 1 hour 
    unlink($file); 
    } 
} 

मैं इसका उपयोग कर रहा हूं, उम्मीद है कि यह मदद करता है।

संबंधित मुद्दे