2011-07-13 6 views
6

、それらのいくつかは、ファイルのサイズを取得するPHPで利用可能な内蔵機能のかなりがあります:filesizestatftell最速の方法は、コード内で開かれた(PHP)私が知っている

私の質問は、かなり興味深いですftellの周りにあります、ファイルからファイルポインタの整数値を返します。

ftell機能を使用してファイルのサイズを取得できますか?はいの場合は、どのように教えてください?

シナリオ:

  1. システム(コード)は、「」コンテンツを追加するモードで既存のファイルを開きます。
  2. ファイルポインタは、行末を指します。
  3. コンテンツはファイルに更新されます。
  4. システムはftellを使用してファイルのサイズを計算します。

答えて

12

fstat任意アクロバットことなく、ファイルサイズを決定する:ファイルに追記("a")フラグで開かれたとき

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

ftellを使用することができません。また、最初にfseek($f, 0, SEEK_END)というファイルの最後まで検索する必要があります。

+0

ありがとう、 'fseek'の情報がトリックでした。私は 'ftell'と一緒に' fseek'を使いました。そして、それは最も速かったです。 –

2

ftell()は実際にているどのように多くのをファイルにするを仮定されていませんが、どのように多くのバイトを伝えることができます。 Sparse filesディスクの空き容量が最終的に求めている値より少なくなり、通知が返されます。

0

ありがとう@Phihag、あなたの情報はfseekと一緒にftell私ははるかに良い方法でサイズを計算することができます。ここにコードを見てください: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このベンチマークは**完全に間違っていることに注意してください**:まず、あなたはほとんど測定できないものを測定します。まったくの場合、100K +ランを測定する必要があります。 10^-5秒はいくつかのタイマーの解像度よりも大きい。また、 'fopen'がかかる時間は数えません。 (ところで、私が提案したのは*ファイルサイズではなく、ハンドルでも動作する 'fstat'でした)ので、リンゴとオレンジを比較しています(ハンドルとファイルシステムのパスを比較しています)。さらに、キャッシングを考慮に入れません。当然、 'fseek'を呼び出す時には、ファイルサイズはすでに決定され、キャッシュされています。 – phihag

+0

@Phihag私はタイマが長いことに同意しますが、私はオープンされているファイルサイズを計算する最良の方法を見つけようとしています。私は100 reqのベンチマークを実行しました。 100並行レベルでは、私はまだ 'ftell'が最高だと思っています。 –

+0

@S Rakesh Bestは最速と等価である必要はありません(スピードを出せば、PHPコードは書かないでしょう)。あなたはまだ 'ファイルサイズ'から 'fstat' /' ftell'の形でリンゴとオレンジを比較していることに注意してください。また、結果は一般的なコンピュータとキャッシング設定に依存することに注意してください。例えば、あなたのCPUキャッシュがすでにウォームアップされていて、inode構造体を含んでいる場合、 'filesize'(最初のinodeを見つけなければなりません)は、より遅くなります。一方、ファイルのiノード(および場合によってはディレクトリを含む)がHDDから読み取られなければならない設定では、... – phihag

関連する問題