Webprofis is een Forum waarin je vragen kunt stellen die webgerelateerd zijn. Heb je vragen over of problemen met je Webpagina, HTML, CSS, Javascript, PHP of andere client of serverside scriptingtalen? Stel ze dan gerust op dit forum. Op dit forum zijn een aantal vrijwilligers actief die u graag met uw vragen willen helpen en u waar mogelijk een passend antwoord aanbieden. Hebt u zelf veel ervaring en kennis met betrekking tot het bovenstaande? U bent van harte welkom om uw kennis met anderen te delen!

We hopen dat eenieder op dit Forum een leerzame ervaring mag opdoen.

Team Webprofis

verwijder files uit map ouder dan 1 minuut

bewerkt zo 16 nov 2014 in PHP, MySQL Posts: 879
Ik ben hier aan het testen met een script dat bestanden ouder dan 1 minuut uit de map test moet verwijderen.
Wat gebeurt er: bestanden worden direct verwijderd, al staan ze er slechts enkele seconden in de map.
Wat gaat er hier fout?

<?php
$files = array();
$index = array();
$deletetime = strtotime('+60 seconds');

if ($handle = opendir('uploads/test')) {
clearstatcache();
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$files[] = $file;
$index[] = filemtime( 'uploads/test/'.$file );
}
}
closedir($handle);
}

asort( $index );

foreach($index as $i => $t) {

if($t < $deletetime) {
@unlink('uploads/test/'.$files[$i]);
}

}
?>
Getagd:

Reacties

  • bewerkt di 11 nov 2014
    PMPosts: 732
    +60 seconden na wat voor tijd?
    Is het niet dat je ook de huidige tijd moet aangeven, en dan +60 ?

    Doe eens echo $deletetime
    If it's not fun, you're not doing it right!
  • PMPosts: 879
    Bij de echo krijg ik dit:
    1415729537
    Ik heb er de default timezone voor gezet maar hij verwijdert ze nog steeds direct;

    date_default_timezone_set('Europe/Amsterdam');
  • bewerkt di 11 nov 2014
    PMPosts: 879
    ik heb nu in de echo gezet:

    echo date('Y-m-d', strtotime($deletetime));
    Resultaat:
    1970-01-01
  • bewerkt di 11 nov 2014
    PMPosts: 879
    Oke dan.
    Ik heb nu deze code en die werkt perfect:

    <?php

    /*** map naar bestanden ***/
    $dir = "uploads/test/";

    /*** loop door alle bestanden in de map ***/
    foreach (glob($dir."*") as $file) {

    /*** als bestand(en) ouder is dan 60 sec na upload; verwijderen ***/
    if (filemtime($file) < time() - 60) { // 60 seconden
    unlink($file); // verwijderen
    }
    }

    ?>

    Nu alleen nog ervoor zorgen dat het script automatisch blijft draaien en niet handmatig hoef aan te klikken
  • PMPosts: 732
    Is dat wel een optie als hij steeds blijft draaien?
    Geen optie om hem om de 10 minuten te laten draaien.
    If it's not fun, you're not doing it right!
  • PMPosts: 879
    ja dat bedoel ik ook...natuurlijk niet continu...van de andere kant: ik wil hem gaan gebruiken voor de uploads(bijlages) wat mensen doen op dit forum zodat niet na verloop de map uploads stilletjes aan volloopt; ik kan hem dan natuurlijk ook gewoon in de index.php plakken. Bij elke actie op dit forum wordt daar toch een request op gedaan en dan voert ie het uit. Zit te denken aan pak hem beet 30 dagen voor bijlages die gepost worden, daarna worden ze dan automatisch verwijderd, lijkt me redelijk...
  • bewerkt wo 12 nov 2014
    PMPosts: 415
    Hangt van je hosting af (ik weet wel dat het via DA kan)), maar misschien ondersteund die wel cronjobs?
    Dan kun je gewoon elke X-tijd een cronjob aanroepen voor dat script.

    In het enorm fout uitgelegd, is een cronjob een 'bezoeker' die op X-tijd een bepaalde pagina bezoekt/script aanroept.
    Ik heb ook wa dingen met cronjobs gedaan, en het lastigste vond ik het juiste pad naar het bestand vinden (want dat zijn de meest absolute urls die je kan verzinnen)

    Er bestaat geloof ik ook nog een duitste site die cronjobs simuleert, maar of je daarop moet vertrouwen laat ik aan jezelf over.

    anyway, cronjobs is je keyword :)

    edit2,
    Mocht je jezelf wat ingelezen hebben over cronjobs, dan kun je je php script zelfs nog wat versimpelen....
    Je laat die cron elke minuut uitvoeren, en laat die gewoon alles deleten wat meer dan een minuut oud is.
  • PMPosts: 879
    idd @vinTage; cronjobs was ik ook al tegengekomen en heb daar aan zitten te denken. Maar dat is voor mij nieuwe materie en zal me er eerst eens grondig in moeten verdiepen. Waar ik het voor wil gebruiken is wat ik hierboven al meldde dat me de map uploads met al zijn bijlages die erin gepost worden niet stilletjes aan volloopt. Ik denk dat ik vooralsnog gewoon dat bestand in de index.php neerzet, waar toch elke dag een request op gedaan wordt en dan wordt ie automatisch uitgevoerd.
  • PMPosts: 732
    Worden de uploads van bezoekers zoals een zip ook opgeslagen in de database?
    If it's not fun, you're not doing it right!
  • bewerkt wo 12 nov 2014
    PMPosts: 415
    Echt verdiepen hoeft niet hoor.
    Schrijf gewoon je php script en verder is het een regeltje aanmaken met de juiste tijden en path, en klaar :D

    in Direct admin op de index onder de link cronjobs, uitleg staat erbij.

    Elke keer dat script aanroepen middels de index is echt z????r zware overkill en nutteloze rekenkracht.
    Ik denk dat je je scriptje een keer per nacht aanroept, je je server matst ;-)
  • bewerkt wo 12 nov 2014
    PMPosts: 879
    @vinTage; daar heb je idd gelijk in, index.php wordt te vaak aangeroepen en dat zijn idd onnodig veel requests
    Ik kan hem natuurlijk handmatig aanklikken eke dag maar dat ga ik vergeten.
    Daarom ga ik toch maar met jouw optie aan de slag...even kijken hoe dat met die cronjobs werkt 8-|

    @ReneV: ja de verwijzingen van de bijlages worden in de database opgeslagen; ik moet gaan oppassen dat ik sec de map leeg van tijd tot tijd waar ook de bijlages alleen in staan, niet dat dadelijk iemand zin avatar kwijt is :-O :-O :-O
  • PMPosts: 732
    Zodra ze in de database staan hangt er een datum aan vast?
    Als een bezoeker dan uitlogt, laat hem dan kijken naar de database of deze bezoeker files heeft geupload die ouder zijn dan ... dagen of dergelijk, zo ja dan wissen.

    Want als ze in de database staan, en jij wist ze door een scriptje uit een bepaalde map, dan staat je database dadelijk vol met dode links.
    If it's not fun, you're not doing it right!
  • PMPosts: 879
    klopt helemaal, als ik de files verwijder maar de links ernaartoe niet dan blijven de dode links in de DB staan
    er is wel tijdstip aan gekoppeld; hieronder een SQl dump van de media:
    zip
    zip
    GDN_Media.zip
    8K
  • PMPosts: 732
    Je zou iets moeten maken wat in deze table zoekt naar rows ouder dan bijvoorbeeld 1 dag.
    Heeft hij dit gevonden, zet er dan eerst iets van unlink path, en dan delete de data
    If it's not fun, you're not doing it right!
Login of Registreer om te reageren.