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
Alessandro Marinuzzi
Aggiungi CommentoStampaPost ID: 52441
Copyright © 2002-2012, Alessandro Marinuzzi
[Home]