Warte... das war nicht zu Ende gedacht

Die Einträge würden dann auch noch in der WB-Datenbank stehen, heißt: in solch ein Script müßte auch eine Löschanweisung für die zu löschenden Dateien.
Habe ein ähnliches Script hier laufen (nicht WB), das mir nicht mehr benötigte Bilder löscht.
Dabei lese ich die Bilder, die die Datenbank verwendet in ein Array, die Bilder, die im Verzeichnis sind in ein zweites.
Danach wird das zweite Array gekürzt, d.h. die benötigten Bilder werden rausgestrichen. Über bleibt, was nicht benötigt wird. Das wird dann in einer Schleife gelöscht.
Ähnlich würde das dann mit den Downloaddateien bei dir gehen. Alle Downloads vom Uploaddatum + 90 Tage aus der DB auslesen, Dateinamen in ein Array, betroffene Datensätze löschen, betroffene Dateien löschen.
Das Stück Script ist hier Bestandteil einer Backend-Seite, die im Normalfall einmal im Monat aufgerufen wird. Da du dir aber eine feste Zeitspanne vorstellst, wäre ein Cronjob die bessere Alternative.