2011-07-13 2 views
6

Je sais qu'il ya un peu de fonctions en construction disponibles dans PHP pour obtenir la taille du fichier, certains d'entre eux sont: filesize, stat, ftell , etcmoyen le plus rapide pour calculer la taille d'un fichier ouvert dans le code (PHP)

Ma question se situe autour de ftell ce qui est assez intéressant, il vous renvoie la valeur entière du pointeur de fichier à partir du fichier.

Est-il possible d'obtenir la taille du fichier en utilisant la fonction ftell? Si oui, alors dites-moi comment?

Scénario:

  1. système (code) ouvre un fichier existant avec le mode "a" pour ajouter le contenu.
  2. Le pointeur de fichier pointe vers la fin de la ligne.
  3. Le système met à jour le contenu dans le fichier. Le système utilise le ftell pour calculer la taille du fichier.

Répondre

12

fstat détermine la taille du fichier sans l'acrobatie:

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

ftell ne peut pas être utilisé lorsque le fichier a été ouvert avec l'append ("a") drapeau. En outre, vous devez d'abord chercher à la fin du fichier avec fseek($f, 0, SEEK_END).

+0

Merci, info sur 'fseek' a fait l'affaire. J'ai utilisé 'fseek' en conjonction avec' ftell' et c'était le plus rapide. –

2

ftell() peut vous dire combien d'octets sont censés être dans le fichier, mais pas combien sont réellement . Sparse files occupe moins d'espace sur le disque que la valeur recherchée jusqu'à la fin et que le retour sera rétabli.

0

Merci @Phihag, avec vos informations sur fseek avec ftell Je suis en mesure de calculer la taille d'une bien meilleure façon. Voir le code ici: 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 Notez que ce repère est ** totalement faux **: D'abord, vous mesurez quelque chose à peine mesurable. Si tout, vous devriez mesurer un 100K + exécute. 10^-5s est plus grand que la résolution de certains temporisateurs. De plus, vous ne comptez pas le temps pris par 'fopen'. (Par ailleurs, ce que j'ai suggéré était * not * 'filesize', mais' fstat', qui fonctionne aussi sur les poignées), donc vous comparez les pommes aux oranges (accéder à un handle par rapport à un chemin dans le système de fichiers). De plus, vous ne prenez pas en compte la mise en cache. Naturellement, au moment où vous appelez 'fseek', la taille du fichier a déjà été déterminée et mise en cache. – phihag

+0

@Phihag Je suis d'accord que les minuteurs sont longs, mais j'essaie juste de trouver la meilleure façon de calculer la taille du fichier qui est ouvert. J'ai fait un benchmark de 100 req. avec 100 niveau concurrent, je trouve toujours 'ftell' est le meilleur. –

+0

@S Rakesh Best n'a pas à égaler le plus rapidement (si vous étiez hors de vitesse, vous n'écririez pas de code php). Notez que vous comparez toujours des pommes à des oranges sous la forme de 'filesize' à' fstat'/'ftell'. Notez également que les résultats dépendent de la configuration générale de l'ordinateur et de la mise en cache. Par exemple, si vos caches CPU sont déjà préchauffés et contiennent la structure inode, 'filesize' (qui doit trouver l'inode en premier lieu) sera plus lent. D'autre part, si vous êtes dans une configuration où l'inode du fichier (et éventuellement contenant des répertoires) doivent être lus à partir d'un disque dur, ... – phihag

Questions connexes