Script macht nicht genau, was ich will
Kurt
- php
Hallo,
kann mir einer sagen, warum das Script im ersten Durchlauf nicht die Gesamtgröße in mb anzeigt?
Ich erhalte lediglich "fertig mb" angegeben. Wenn ich dann F5 drücke, zeigt mir das Script auch die Gesamtgröße innerhalb des "fertig-Textes" an.
Gruß, Kurt
<?
//=========================================================
// Funktion
//=========================================================
function check_dir($pfad = './',$max_size = '') {
$gesamtgroesse = 0;
foreach (glob("*.*") as $filename) {
//echo "$filename - Größe: " . filesize($filename) . "<br />";
$gesamtgroesse = $gesamtgroesse + filesize($filename);
$arr_files[$filename] = filemtime($filename);
}
// Megabyte sind 2 hoch 20 Byte (Binärsystem) / Gigabyte = 2 hoch 30
$gesamtgroesse = round($gesamtgroesse/1048576, 2);
if ($gesamtgroesse > $max_size) {
// lösche älteste Datei
asort($arr_files);
$fileNames = array_keys($arr_files);
unlink($fileNames[0]);
check_dir('./',$max_size);
} else {
return $gesamtgroesse;
}
//=========================================================
} // end function
//=========================================================
//=========================================================
// Scriptsuführung
//=========================================================
$gesamtgroesse = check_dir('./','100');
echo("fertig ".$gesamtgroesse." MB");
exit;
//=========================================================
?>
Lieber Kurt,
manchmal sieht man den Wald vor lauter Bäumen nicht. Insbesondere Du, der Du Deinen Quelltext nicht einrückst, wirst unter diesem Umstand leiden.
Sobald Dein Code übersichtlicher formatiert ist, werde auch ich mich nicht scheuen, ihn genauer anzuschauen.
Liebe Grüße,
Felix Riesterer.
Sobald Dein Code übersichtlicher formatiert ist, werde auch ich mich nicht scheuen, ihn genauer anzuschauen.
Bitteschön.
<?
//=========================================================
// Funktion
//=========================================================
function check_dir($pfad = './', $max_size = '')
{
$gesamtgroesse = 0;
foreach (glob("*.*") as $filename)
{
//echo "$filename - Größe: " . filesize($filename) . "<br />";
$gesamtgroesse = $gesamtgroesse + filesize($filename);
$arr_files[$filename] = filemtime($filename);
}
// Megabyte sind 2 hoch 20 Byte (Binärsystem) / Gigabyte = 2 hoch 30
$gesamtgroesse = round($gesamtgroesse / 1048576, 2);
if ($gesamtgroesse > $max_size)
{
// lösche älteste Datei
asort($arr_files);
$fileNames = array_keys($arr_files);
unlink($fileNames[0]);
check_dir('./', $max_size);
}
else
{
return $gesamtgroesse;
}
//=========================================================
} // end function
//=========================================================
//=========================================================
// Scriptsuführung
//=========================================================
$gesamtgroesse = check_dir('./', '100');
echo ("fertig " . $gesamtgroesse . " MB");
exit;
//=========================================================
Hello,
Sobald Dein Code übersichtlicher formatiert ist, werde auch ich mich nicht scheuen, ihn genauer anzuschauen.
Bitteschön.
[code lang=php]
<?//=========================================================
// Funktion
//=========================================================function check_dir($pfad = './', $max_size = '')
Was ist der Zweck der Funktion?
Was sollen die beiden Attribute bewirken?
{
$gesamtgroesse = 0;
Wofür steht $gesamtgroesse?
foreach (glob("*.*") as $filename)
Bist Du sicher, dass glob() immer ein Ergebnis liefert, dass von foreach() verarbeitet werden kann?
In welchem Working-Directory soll die Funktion arbeiten? Wieso wird das glob() nicht mitgeteilt? Funktionen sollten doch so allgemeingültig wie möglich sein!
{
//echo "$filename - Größe: " . filesize($filename) . "<br />";
Bist Du dir über die Wirkung von clearstatcache() im Klaren?
http://de3.php.net/manual/en/function.clearstatcache.php
$gesamtgroesse = $gesamtgroesse + filesize($filename);
Warum wird filesize() doppelt aufgerufen? Das mag zwar unter PHP inzwischen so üblich sein, ist aber kein sauberer Programmierstil.
$arr_files[$filename] = filemtime($filename);
}
usw.
Außerdem sollte eine Funktion zur Beschaffung von Daten keine Daten an die Standardausgabe ausgeben. Trenne immer sauber die Steuerflusskomtrolle, die Datenhaltung, die Datenbeschaffung, die Datenverarbeitung, und die Ergebnisausgabe voneinander. Juppi-Programmierer haben dieser Forderung auch einen eigenen Namen gegeben: MVC-Model.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
manchmal sieht man den Wald vor lauter Bäumen nicht. Insbesondere Du, der Du Deinen Quelltext nicht einrückst, wirst unter diesem Umstand leiden.
Sobald Dein Code übersichtlicher formatiert ist,
und kommentiert. Das bedeutet, dass dort steht, was Du dir gedacht hast, was passieren soll und nicht etwa, dass Du nochmal hinschreibst, was passiert.
werde auch ich mich nicht scheuen, ihn genauer anzuschauen.
schließe ich mich an...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
und kommentiert. Das bedeutet, dass dort steht, was Du dir gedacht hast, was passieren soll und nicht etwa, dass Du nochmal hinschreibst, was passiert.
Nochmal Bitteschön:
<?
//=========================================================
// Funktion
//=========================================================
function check_dir($pfad = './', $max_size = '')
{
$gesamtgroesse = 0;
// Alle Dateien einlesen
foreach (glob("*.*") as $filename)
{
$gesamtgroesse = $gesamtgroesse + filesize($filename);
$arr_files[$filename] = filemtime($filename);
}
// Megabyte sind 2 hoch 20 Byte (Binärsystem) / Gigabyte = 2 hoch 30
$gesamtgroesse = round($gesamtgroesse / 1048576, 2);
// Wenn die kummlulierte Dateigröße/Verzeichnissgröße größer als $max_size (hier 100 MB) ist,
// soll solange die älteste Datei gelöscht werden, bis sie darunter liegt.
if ($gesamtgroesse > $max_size)
{
// lösche älteste Datei
asort($arr_files);
$fileNames = array_keys($arr_files);
unlink($fileNames[0]);
// Funktion soll sich selber erneut aufrufen...
check_dir('./', $max_size);
}
else
{
// ...oder mir die Größe ausspucken.
return $gesamtgroesse;
}
//=========================================================
} // end function
//=========================================================
//=========================================================
// Scriptsuführung
//=========================================================
$gesamtgroesse = check_dir('./', '100');
echo ("fertig " . $gesamtgroesse . " MB");
exit;
//=========================================================
Hallo Kurt,
kann mir einer sagen, warum das Script im ersten Durchlauf nicht die Gesamtgröße in mb anzeigt?
das macht das Script nur dann, wenn die Maximalgröße überschritten wird.
So hast Du das programmiert.
Wird die Maximalgröße nicht überschritten, so wird im ersten Durchlauf die Gesamtgröße in MB angezeigt.
Wird die Maximalgröße überschritten, so
<?
function check_dir($pfad = './',$max_size = '') {
if ($gesamtgroesse > $max_size) {
// lösche älteste Datei
asort($arr_files);
$fileNames = array_keys($arr_files);
unlink($fileNames[0]);
check_dir('./',$max_size);} else {
return $gesamtgroesse;
}
} // end function
//=========================================================
// Scriptsuführung
//=========================================================$gesamtgroesse = check_dir('./','100');
echo("fertig ".$gesamtgroesse." MB");
exit;
?>
Neben der bereits [von Tom geäußerten Kritik](https://forum.selfhtml.org/?t=209433&m=1425399), dass Du nichts mit dem übergebenen Pfad anfängst, kann Deine Funktion wunderbar in ein Speicherlimit laufen, weil Du für jede zu löschende Datei im rekursiven Aufruf erneut und zusätzlich den Verzeichnisinhalt in ein neues Array einliest, dieses sortierst, ...
Vorschlag:
Statt des rekursiven Aufrufs gehe besser wie folgt vor:
Solange die Gesamtgröße größer ist als der erlaubte Maximalwert und noch Dateien vorhanden sind
Merke Dir die Dateigröße der Datei, die Du löschen willst.
Wenn das Löschen der Datei erfolgreich war,
ziehe diese Größe von der Verzeichnisgesamtgröße ab
Ende Wenn
Entferne die Datei aus dem Array
(auch wenn sie nicht gelöscht werden konnte, damit Du nicht endlos
hängen bleibst)
Ende solange
Gib die neue Gesamtgröße zurück
Freundliche Grüße
Vinzenz