22 Gennaio 2012 11:55:05 · [php - filesize() e sistemi a 32 bit]
Postato da
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  
 
16 Aprile 2015 10:00:03 · [php - filesize() e sistemi a 32 bit]
Postato da
<?php
  ######################################################################
  # Human size for files smaller or bigger than 2 GB on 32 bit Systems #
  # size.php - 1.2 - 16.04.2015 - 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));
        $size = $f->Size;
      } else {
        $size = trim(@exec("for %F in (\"" . $file . "\") do @echo %~zF"));
      }
    } elseif (PHP_OS == 'Darwin') {
      $size = trim(@exec("stat -f %z " . $file));
    } else {
      $size = trim(@exec("stat -c %s " . $file));
    }
    if (!is_numeric($size)) {
      $size = filesize($file);
    }
    if ($size < 1024) {
      return $size . ' Byte';
    } elseif ($size < 1048576) {
      return round($size / 1024, 2) . ' KB';
    } elseif ($size < 1073741824) {
      return round($size / 1048576, 2) . ' MB';
    } elseif ($size < 1099511627776) {
      return round($size / 1073741824, 2) . ' GB';
    } elseif ($size < 1125899906842624) {
      return round($size / 1099511627776, 2) . ' TB';
    } elseif ($size < 1152921504606846976) {
      return round($size / 1125899906842624, 2) . ' PB';
    } elseif ($size < 1180591620717411303424) {
      return round($size / 1152921504606846976, 2) . ' EB';
    } elseif ($size < 1208925819614629174706176) {
      return round($size / 1180591620717411303424, 2) . ' ZB';
    } else {
      return round($size / 1208925819614629174706176, 2) . ' YB';
    }
  }
?>

Nuova versione migliorata, adesso basta che la funzione exec di php sia disponibile che diventa possibile calcolare esattamente la dimensione di un grosso file. Testato personalmente in più di una occasione. Ho addirittura inserito questa mia funzione in un mio progetto. Buon divertimento!  




Copyright © 2002-2018, Alessandro Marinuzzi