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