2011-07-13 21 views
6

Sé que hay un poco de funciones incorporado disponibles en PHP para obtener el tamaño del archivo, algunos de ellos son: filesize, stat, ftell , etc.La forma más rápida para calcular el tamaño de un archivo abierto en el código (PHP)

Mi pregunta se encuentra alrededor de ftell que es bastante interesante, le devuelve el valor entero del puntero de archivo del archivo.

¿Es posible obtener el tamaño del archivo usando la función ftell? Si es así, entonces dime ¿cómo?

Escenario:

  1. del sistema (código) abre un archivo existente con el modo "a" para añadir el contenido.
  2. Puntero de archivo apunta al final de la línea.
  3. El sistema actualiza el contenido en el archivo.
  4. El sistema usa ftell para calcular el tamaño del archivo.

Respuesta

12

fstat determina el tamaño del archivo sin ningún acrobacias:

$f = fopen('file', 'r+'); 
$stat = fstat($f); 
$size = $stat['size']; 

ftell no se puede utilizar cuando el archivo se ha abierto con la ("a") flag append. Además, primero debe buscar el final del archivo con fseek($f, 0, SEEK_END).

+0

Gracias, la información sobre 'fseek' hizo el truco. Usé 'fseek' junto con' ftell' y fue el más rápido. –

2

ftell() que puedo decir cuántos bytes son supone estar en el archivo, pero no cuántos realmente son . Sparse files ocupa menos espacio en el disco que el valor que busca hasta el final y volverá diciendo.

0

Gracias @Phihag, con su información en fseek junto con ftell soy capaz de calcular el tamaño de una manera mucho mejor. Vea el código aquí: http://pastebin.com/7XCqu0WR

<?php 
$fp = fopen("/tmp/temp.rock", "a+"); 

fwrite($fp, "This is the contents"); 

echo "Time taken to calculate the size by filesize function: "; 
$t = microtime(true); 
$ts1 = filesize("/tmp/temp.rock") . "\n"; 
echo microtime(true) - $t . "\n"; 

echo "Time taken to calculate the size by fstat function:"; 
$t = microtime(true); 
$ts1 = fstat($fp) . "\n"; 
$size = $ts1["size"]; 
echo microtime(true) - $t . "\n"; 

echo "Time taken to calculate the size by fseek and ftell function: "; 
$t = microtime(true); 
fseek($fp, 0, SEEK_END); 
$ts2 = ftell($fp) . "\n"; 
echo microtime(true) - $t . "\n"; 

fclose($fp); 

/** 
OUTPUT: 

Time taken to calculate the size by filesize function:2.4080276489258E-5 
Time taken to calculate the size by fstat function:2.9802322387695E-5 
Time taken to calculate the size by fseek and ftell function:1.2874603271484E-5 

*/ 
?> 
+0

@S Rakesh Tenga en cuenta que este punto de referencia es ** totalmente erróneo **: En primer lugar, mide algo apenas mensurable. Si es así, debes medir 100K + carreras. 10^-5s es más grande que la resolución de algunos temporizadores. Además, no cuenta el tiempo que tarda el 'fopen'. (Por cierto, lo que sugerí era * no * 'tamaño de archivo', pero' fstat', que también funciona en controladores), así que estás comparando manzanas con naranjas (accediendo a un identificador frente a una ruta en el sistema de archivos) de todos modos. Además, no tiene en cuenta el almacenamiento en caché. Naturalmente, para cuando llame a 'fseek', el tamaño del archivo ya ha sido determinado y almacenado en caché. – phihag

+0

@Phihag Estoy de acuerdo en que los temporizadores son largos, pero solo estoy tratando de encontrar la mejor manera de calcular el tamaño del archivo que se abre. Hice un benchmark de 100 req. con 100 niveles simultáneos, todavía encuentro 'ftell' es el mejor. –

+0

@S Rakesh Best no tiene que ser igual de rápido (si no fuera por la velocidad, no escribiría el código php). Tenga en cuenta que todavía está comparando manzanas con naranjas en forma de 'tamaño de archivo' a' fstat'/'ftell'. También tenga en cuenta que los resultados dependen de la configuración general de la computadora y el almacenamiento en caché. Por ejemplo, si los cachés de su CPU ya están calentándose y contienen la estructura del inodo, 'filesize' (que tiene que encontrar el inode en primer lugar) serán las magnitudes más lentas. Por otro lado, si está en una configuración donde el inodo del archivo (y posiblemente con directorios) debe leerse desde una HDD, ... – phihag

Cuestiones relacionadas