30. juli 2004 - 15:09Der er
12 kommentarer og 1 løsning
hvordan slette filer i temp mappe som har lagt der i over 6 timer
Jeg har en temp-mappe hvor filer bliver uploadet til og hvis brugeren på en eller anden måde afslutter halvvejs i en process, så ligger der bare nogle filer og fylder mere og mere på min server. Jeg vil høre om i har en løsning enten
hvordan jeg kan slette filer som er ældre end 3 timer i min temp mappe. Et script, der kan lægges hvor brugerne en gang imellem kommer alligevel!
har fået følgende foreslag på udvikleren.dk, men det virker ikke som det skal!
// Her slettes filer der har lagt i temp-mappen i over 6 timer $t=time(); if ($handle = opendir('../upload/temp/')){ //sæt evt @ foran opendir while (false !== ($filename= readdir($handle))){ if(!is_file($filename))continue; //hvad sker der her ? continue? if($t>(filemtime($filename)+21600)){ unlink($filename); } } closedir($handle); }
Jeg tror det er valget time() eller filemtime($filename) der er forkert! hvilket resultat kunne filemtime($filename))+21600 feks gi? hvilket resultat giver time() ? ligner de hinanden? er der dato med eller er det alene klokken?
Har du en ide til hvordan jeg kan gøres? Skriv endelig!
Den kikser fordi der ikke tages hensyn til stien i filemtime() og unlink(). Prøv:
<?php // Her slettes filer der har lagt i temp-mappen i over 6 timer $dir = '../upload/temp/'; $t=time(); if ($handle = opendir($dir)){ //sæt evt @ foran opendir while (false !== ($filename = readdir($handle))){ if(!is_file($dir.$filename))continue; //hvad sker der her ? continue? if($t>(filemtime($dir.$filename)+21600)){ unlink($dir.$filename); } } closedir($handle); } ?>
ps: continue gør at løkken fortsætter, hvis der ikke er tale om en fil (fx: . og ..).
Jer begge: kunne der så ik bare stå sådan her: if(is_file($dir.$filename)){ if($t>(filemtime($dir.$filename)+21600)){ unlink($dir.$filename); } } ville det virke på samme måde?
detox: du skrev:continue gør at løkken fortsætter, hvis der ikke er tale om en fil (fx: . og ..) Jeg forstår stadig ik helt??
sukos: time() er tiden i sekunder siden 1-1-1970 vil det ik sige at det er et nummer som feks 2562567722 (sekunder siden 1970) og filemtime($dir.$filename) giver noget der ligner(uden mellemrum) 2001 12 28 240038 -Kan man så bruge de to at evaluere ud fra? Jeg mener den ene er sekunder og den anden er nærmest dato/klokken eller har jeg misforstået det?
exec, system og backtick kræver at du rent faktisk MÅ (kan) køre shell-kommandoer fra php, det er ikke alle steder.
find er en std linux-kommando, her vil den kigge /sti/til/din/temp og alle underbiblioteker igennem efter filer der er ældre end 360 minutter og derefter køre "rm -f" på disse, altså slette dem. :)
Tjoh, if(is_file($dir.$filename)){ og if(!is_file($dir.$filename))continue; giver formentlig samme resultat. Det er korrekt at tiderne udregnes ift. 1.1.1970, så 21600 = 6 timer. Hvis det skal være 3 timer, skal du selvfølgelig rette til: 10800. filemtime() returnerer osse et unix timestamp, så de kan godt sammenholdes.
<?php // Her slettes filer der har lagt i temp-mappen i over 6 timer $dir="../upload/temp/"; $t=time(); if ($handle = @opendir($dir)){ while (false !== ($filename= readdir($handle))){ if(is_file($dir.$filename)){ if($t>(filemtime($dir.$filename)+21600)){ unlink($dir.$filename); } } } closedir($handle); } ?>
Jeg har ik testet det endnu! Men regner med det virker!
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.