Tell me please! When files are uploaded to file sharing, everything goes fine, but after I implemented the function of cleaning old files when the maximum allowed file storage size was exceeded, my cycle does not fall, but it clears all files, and I need to clean up to a certain value:

This is a link to my file sharing service: http://test.afc.ru/exchange/index.php.

<? $path = 'storage'; // ΠΏΠ°ΠΏΠΊΠ° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄Ρƒ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ $beforeDir = scandir('storage'); // ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², располоТСнных ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ Π΄ΠΎ удалСния старого Ρ„Π°ΠΉΠ»Π° echo "<br><p style='margin-left: 75px; color: blue;'><i>Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ ΠΏΠ°ΠΏΠΊΠΈ <b>storage</b> Π΄ΠΎ очистки:</i><br>"; for ($i = 0; $i < count($beforeDir); $i++) echo "<span style='text-align: left; margin-left: 250px; color: green;'>$i. <i>$beforeDir[$i]</i></span>"."<br />"; //print_r($beforeDir); //echo $dir[3]; echo "$maxFileSize - ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° допустим: 10ΠœΠ‘<br>"; echo "$filesize - Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° доупстим: 5Мб<br>"; echo "$fileSize - Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ допустим ΠΎΠ½ прСвысил: 20Мб<br><br>"; // Ѐункция удалСния Ρ„Π°ΠΉΠ»ΠΎΠ² if($fileSize > $maxFileSize){ // Ссли Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ прСвысил ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ $MFS = $maxFileSize; $FS = $fileSize; echo "$MFS - NEW максималка<br>"; // Ρ‚Π°ΠΊ для сСбя echo "$FS - NEW ΠΎΠ±Ρ‰ΠΈΠΉ вСс<br>"; // Ρ‚Π°ΠΊ для сСбя /* запускаСм Ρ†ΠΈΠΊΠ» удалСния Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€ΠΈ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°*/ while ($FS > $MFS){ // ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΏΠΎΠΊΠ° вСс Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ большС максимального $path = 'storage'; //ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽ Π΄ΠΈΡ€Ρ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ $beforeDir = scandir('storage'); //ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽ Π΄ΠΈΡ€Ρ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ if (unlink("storage/$beforeDir[3]")) //Π²Ρ‹Ρ‚Π°ΡΠΊΠΈΠ²Π°ΡŽ ΠΈΠ· массива 4 элСмСнт ΠΈ ΡƒΠ΄Π°Π»ΡΡŽ сэтим ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„Π°ΠΉΠ» Π² ΠΏΠ°ΠΏΠΊΠ΅ storage, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 3 это: 0. .; 1. ..; 2. .htaccess; echo "<span style='text-align: center; color: red;'>Π€Π°ΠΉΠ»: $beforeDir[3] - ΡƒΠ΄Π°Π»Π΅Π½!</span>"; else echo "<span style='text-align: center; color: red;'>Папка <b>storage</b> пуста!</span>"; /* снова ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Π½Π° ΠΎΠ±Ρ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π€Π₯ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ */ function getFilesSize(){ // Ѐункция опрСдСлСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΏΠ°ΠΏΠΊΠΈ $path = 'storage'; //ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽ Π΄ΠΈΡ€Ρ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ $FS = 0; // ΠΏΠΎΠΊΠ° Π½Π΅ понял Π·Π°Ρ‡Π΅ΠΌ с нуля Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ, Π±Ρ€Π°Π» ΠΊΠΎΠ΄ ΠΈΠ· ΠΈΠ½Π΅Ρ‚Π° $dir = scandir($path); // ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², располоТСнных ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ foreach($dir as $file){ // Ρ†ΠΈΠΊΠ» Ρ‚Π°ΠΊ ΠΈ Π½Π΅ понял шо Π΄Π΅Π»Π°Π΅Ρ‚, Π½ΠΎ ΠΈ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ‚ΠΎ ΠΈ Ρ…ΠΎΡ‚Π΅Π», Π³Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚! if (($file!='.') && ($file!='..')) if(is_dir($path . '/' . $file)) $FS += getFilesSize($path.'/'.$file); else $FS += $FS($path . '/' . $file); } return $FS; // Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ "Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠšΠ±Π°ΠΉΡ‚Π°Ρ…" } $FS = (int)((getFilesSize()/1024)/1024); // ΠžΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎ ΠœΠ±Π°ΠΉΡ‚ΠΎΠ²*/ } ?> 

    1 answer 1

    I would do wrong.

    If you have a repository, it is likely to pump from there.

    Since you need to have as many people as possible, it means that you have to lay what they are pumping.

    I.e. Each time you download a file (at worst, when you show a page with a link), you make a +1 from the counter of that file. In the example, the counter, this is the .rande file. The IMFAYLE file is in the same folder as the downloaded file.

     function rangesort ($a, $b) { if ($a['range'] > $b['range']) return 1; else return -1; } function getFilesSize($path) { global $files; $dir = scandir($path); foreach($dir as $file){ if (substr($file,0,1) != '.') { if(is_dir($path . '/' . $file)) getFilesSize($path.'/'.$file); else { $files[$path . '/' . $file]['size'] = filesize($path . '/' . $file); $files[$path . '/' . $file]['range'] = file_get_contents($path . '/.range.' . $file); } } } } $files = array(); getFilesSize('full_storage_path_recomend'); usort($files, "rangesort"); 

    Then you run foreach ($ files as $ fullfilename => $ attribs) on this array and delete the least popular files in turn until you return to the limit.

    By the way, to determine whether you have reached Zen, you do not need to go through a cycle each time. It is enough to count the total size once, and then, after each deletion, subtract from the total size, what was deleted.

    If for some reason you do not have the opportunity to make a calculation, then the general idea - first create an array, then delete - remains. Moreover, the more files you have, the faster it will work in the end (due to a large decrease in the launches of cycles). You can not sort, but you can delete the oldest. Or the biggest ....

    I will not write the full code) Coach.

    • Thank you very much! It's a pity I can't reward, I'm still green :) - archisova