Hallo,
ich habe ein Formular erstellt bei dem der Anwender nacheinander beliebig
viele Dateien hochladen kann.(Das Formular wird wiederholt angezeigt) Die
Dateien werden nach dem Upload im Ordner tmp gespeichert. Wenn alle
Dateien hochgeladen sind wird das Formular über einen "Bestätigen"
Button abgeschickt und die Dateien werden vom Ordner tmp in den Ordner
Work verschoben. So weit funktioniert auch alles.
Wenn der Anwender aber den Browser schließt ohne das Formular
mit "Bestätigen" abzuschicken liegen die Dateien im Ordner tmp unnötig
um.
Kann ich irgendwie festlegen das die Dateien im Ordner tmp nach der
automatischen Beendigung der Session(Zeitablauf) gelöscht werden?
Ich hab mir dazu ein Skript geschrieben das ich in PHP Skripte includen kann
Code unten). Grob gesagt soll das Skript bei jedem Seitenaufruf prüfen
welche Sessions noch laufen und dementsprechend die nicht mehr
benötigetn Ordner löschen.
Ist das OK so oder bin ich total auf dem Holzweg und PHP kann das
automatisch erledigen?
ich habe ein Formular erstellt bei dem der Anwender nacheinander beliebig
viele Dateien hochladen kann.(Das Formular wird wiederholt angezeigt) Die
Dateien werden nach dem Upload im Ordner tmp gespeichert. Wenn alle
Dateien hochgeladen sind wird das Formular über einen "Bestätigen"
Button abgeschickt und die Dateien werden vom Ordner tmp in den Ordner
Work verschoben. So weit funktioniert auch alles.
Wenn der Anwender aber den Browser schließt ohne das Formular
mit "Bestätigen" abzuschicken liegen die Dateien im Ordner tmp unnötig
um.
Kann ich irgendwie festlegen das die Dateien im Ordner tmp nach der
automatischen Beendigung der Session(Zeitablauf) gelöscht werden?
Ich hab mir dazu ein Skript geschrieben das ich in PHP Skripte includen kann
Code unten). Grob gesagt soll das Skript bei jedem Seitenaufruf prüfen
welche Sessions noch laufen und dementsprechend die nicht mehr
benötigetn Ordner löschen.
Ist das OK so oder bin ich total auf dem Holzweg und PHP kann das
automatisch erledigen?
PHP-Code:
<?php
ini_set("session.gc_divisor","1"); //Wahrscheinlichkeit der GarbageCollection auf 1 setzen
ini_set("session.gc_maxlifetime", "3600"); //Maximale Lebensdauer einer Session 3600 Sekunden
session_start();
require 'recrmdir.inc.php'; //Fertiges Skript aus einem Forum
//Verzeichniss unter dem die Session Ordner temporär angelegt
//werden sollen
$tmpFileDirectoryPath = "./uploads/tmp/";
$fileDirectoryPath = "./uploads/";
$maxUploadSize = 10485760; // = 10 MB
$maxDiskSpace = 104857600; // = 100MB
$fillFactor = 0.8;
//Verzeichniss für die aktuelle Session anlegen
$myDirectory = $tmpFileDirectoryPath ."sess_".session_id();
if(!is_Dir($myDirectory))
mkdir($myDirectory);
/*
* Diese Funktion berechnet die Größe eines Verzeichnisses
* inklusive seiner Unterverzeichnisse (Auch aus einem Forum)
*/
function dir_size($dir)
{...}
/*
*Liefert den Ordern der aktuellen Session
*/
function getMyFolder()
{
global $tmpFileDirectoryPath ;
return $tmpFileDirectoryPath ."sess_".session_id()."/";
}
/*
*Liefert den Ordern alle hochgeladenen Dateien beinhaltet
*/
function getMainFolder()
{
global $tmpFileDirectoryPath;
return $tmpFileDirectoryPath;
}
function enoughStorageFor($fileSize)
{
global $maxDiskSpace;
global $maxUploadSize;
$uploadedSize = dir_size(getMyFolder());
$uploadedSize += $fileSize;
return ($uploadedSize<$maxUploadSize &&
getFreeStorageTotal()>$fileSize);
}
function getFreeStorageForSession()
{
global $maxUploadSize;
$uploadedSize = dir_size(getMyFolder());
return ($maxUploadSize - $uploadedSize);
}
function getFreeStorageTotal()
{
global $fileDirectoryPath;
global $maxDiskSpace;
$uploadedSize = dir_size($fileDirectoryPath);
return ($maxDiskSpace - $uploadedSize);
}
/
* Diese Funktion prüft die Größe des Verzeichnisse für temporäre
Dateien gegen seine maximale Größe. Ist ein bestimmter Anteil
erreicht wird eine WarnungsEmail verschickt
*/
function checkAndSend()
{
global $fileDirectoryPath;
global $maxDiskSpace;
global $fillFactor;
if( dir_size($fileDirectoryPath ) >
($maxDiskSpace * $fillFactor ))
{
$percent = ceil(dir_size($fileDirectoryPath ) /
$maxDiskSpace * 100);
...
}
}
/**************************************************
Skriptstart
**************************************************/
//Alle laufenden Sessions auslesen
$sessionDirectoryPath = ini_get('session.save_path');
$sessionDirectory=opendir ($sessionDirectoryPath );
$sessionFiles = array();
while ($file = readdir ($sessionDirectory))
{
//echo "$file <br>";
array_push($sessionFiles, $file);
}
closedir($sessionDirectory);
//Alle angelegten Verzeichnisse auslesen
$fileDirectory = opendir ($tmpFileDirectoryPath);
$fileFiles = array();
while ($file = readdir ($fileDirectory))
{
//echo "$file <br>";
array_push($fileFiles, $file);
}
closedir($fileDirectory );
$needlessFiles = array_diff($fileFiles, $sessionFiles);
for($x=0; $x<sizeOf($needlessFiles); $x++)
{
rec_rmdir($tmpFileDirectoryPath.pos($needlessFiles));
next($needlessFiles);
}
?>
Kommentar