Buona Domenica a tutti! Oggi vorrei parlarvi dei problemi che il
php ha nel girare su architetture a
32 bit... infatti se provate a dare in pasto alla funzione
php filesize() un file che supera i
2 GB noterete che il file viene visto come se fosse inferiore a
2 GB, per capirci meglio facciamo finta di avere un file di
5,47 GB e di darlo in pasto a
filesize(), noterete che invece di
5,47 GB otterrete un banalissimo
1,47 GB. Questo perché sfortunatamente il vostro
php gira su architettura a
32 bit. Per ovviare al problema mi sono scritto una funzione che permette senza problemi di gestire file di qualsiasi dimensione... eccola:
size.php<?php ###################################################################### #
Human size for files smaller or bigger than 2 GB on 32 bit Systems # # size.php - 1.1 - 17.01.2012 - Alessandro Marinuzzi - www.alecos.it # ###################################################################### function showsize($file) { if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { if (class_exists("COM")) { $fsobj = new COM('Scripting.FileSystemObject'); $f = $fsobj->GetFile(realpath($file)); $file = $f->Size; }
else { $file = trim(exec("for %F in (\"" . $file . "\") do @echo %~zF")); } } elseif (PHP_OS == 'Darwin') { $file = trim(shell_exec("stat -f %z " . escapeshellarg($file))); } elseif ((PHP_OS == 'Linux') || (PHP_OS == 'FreeBSD') || (PHP_OS == 'Unix') || (PHP_OS == 'SunOS')) { $file = trim(shell_exec("stat -c%s " . escapeshellarg($file))); } else { $file =
filesize($file); } if ($file < 1024) { echo $file . ' Byte'; } elseif ($file < 1048576) { echo round($file / 1024, 2) . ' KB'; } elseif ($file < 1073741824) { echo round($file / 1048576, 2) . ' MB'; } elseif ($file < 1099511627776) { echo round($file / 1073741824, 2) . ' GB'; } elseif ($file < 1125899906842624) { echo round($file / 1099511627776,
2) . ' TB'; } elseif ($file < 1152921504606846976) { echo round($file / 1125899906842624, 2) . ' PB'; } elseif ($file < 1180591620717411303424) { echo round($file / 1152921504606846976, 2) . ' EB'; } elseif ($file < 1208925819614629174706176) { echo round($file / 1180591620717411303424, 2) . ' ZB'; } else { echo round($file / 1208925819614629174706176, 2) . ' YB'; } } ?> |
Per usarla vi
basterà mettere in cima alla vostra pagina
php un semplice
include come ad esempio questo:
| <?php include("php/size.php"); ?> |
Mentre per visualizzare le dimensioni del file basterà invocare, nella stessa pagina
php, la funzione come segue:
| <?php showsize("file/FileEnorme.tar"); ?> |
E' tutto buon divertimento