Avatar billede learner Praktikant
30. juli 2004 - 15:09 Der 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!

Mvh Michael
Avatar billede sukos Juniormester
30. juli 2004 - 15:22 #1
time()
er tiden i sekunder siden 1-1-1970

du kan prøve at definere den fulde sti til dir
$path = "/fuld/sti/til/dir";

if ($handle = opendir($path))


if(!is_file($filename)) // Hvis $filename er et dir og ikke en fil
Avatar billede detox Nybegynder
30. juli 2004 - 15:27 #2
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 ..).
Avatar billede coderdk Praktikant
30. juli 2004 - 15:40 #3
Hvis du har adgang til exec, system eller backtick:

exec( "find /sti/til/din/temp ! -mmin 360 -exec rm -f {} \;" );
Avatar billede learner Praktikant
30. juli 2004 - 15:52 #4
tak begge to for svarene.

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?

Takker guy's
Avatar billede learner Praktikant
30. juli 2004 - 15:54 #5
Hvis du har adgang til exec, system eller backtick:
exec( "find /sti/til/din/temp ! -mmin 360 -exec rm -f {} \;" );

okay, det forstår jeg bare ingenting af :-)
Er du sød og forklare lidt :-)
Avatar billede coderdk Praktikant
30. juli 2004 - 15:57 #6
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. :)
Avatar billede coderdk Praktikant
30. juli 2004 - 15:59 #7
Avatar billede detox Nybegynder
30. juli 2004 - 15:59 #8
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.
Avatar billede learner Praktikant
30. juli 2004 - 16:16 #9
:-) fedt nok, men hvad skal jeg nu vælge??? :-)

Cool problem! :-)
Avatar billede detox Nybegynder
30. juli 2004 - 16:20 #10
Personligt vil jeg vælge standard php :O)
Avatar billede learner Praktikant
30. juli 2004 - 16:33 #11
Jeg har nu valgt:

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

Tak til jer alle! :-)

Point givet til detox
Avatar billede learner Praktikant
30. juli 2004 - 16:38 #12
Det virker, har lige testet det! Tusind tak allesammen! :-)
Avatar billede majsmarken Nybegynder
30. juli 2004 - 23:52 #13
Her er en universal VBS version der også ka' det der:
http://www.eksperten.dk/spm/393648
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester