2011-01-31 8 views
25

テンプレートにcustom.cssファイルを含めて、サイト所有者が独自のCSSルールを追加できるようにしています。しかし、私がファイルを出荷すると、そのファイルは空であり、規則を追加していなければ読み込むことができません。ファイルが空であるかどうかを判断する最良の方法(php)?

空であるかどうかを判断する最善の方法は何ですか?

if (0 == filesize($file_path)) 
{ 
    // file is empty 
} 

// OR: 

if ('' == file_get_contents($file_path)) 
{ 
    // file is empty 
} 

答えて

41

file_get_contents()filesize()は、ファイルサイズをdetirmineするstat()を使用しながら、ファイル全体を読み込みます。 filesize()を使用すると、ディスクI/Oの消費が少なくなります。

+6

...とはるかに少ないメモリ – symcbean

+1

を消費するだけのたいファイルが前にコールclearstatcache()を変更している場合ことを指摘filesize()を呼び出すと、キャッシュされた結果が得られます。これは私に起こった。 – Firze

+0

これは私のために働いた。ファイルが空の場合は0を返します。 –

8

filesize()を使用すると明らかに優れています。それはファイルをまったく開く必要がないstat()を使用します。

file_get_contents()ファイル全体を読み込みます。10GBのファイルがあるとどうなるか想像してみてください。

+4

あなたのウェブサイトが10GBのCSSファイルをロードするのにかかる時間を想像してください:P – alex

+1

空のCSSを読み込むだけで、読み込みを避けるために空であるかどうかをテストするよりも、 –

+0

小さなファイル(CSSの部分を読んでいない)については、それほど重要ではありません。 inode(またはファイルシステムのキャッシュやPHPの内部stat-cache)に必要なすべての情報が含まれていると、実際にファイルの内容をハードディスクから読み込みたいのですが、filesize()はまだ高速です。 – ThiefMaster

4

filesize()がより効率的ですが、誤解を招く可能性があります。もしも誰かがそこにコメントを入れるだけであれば、それは空白でさえ...ファイルサイズを大きくするでしょう。 IMOでは、最初に/* enabled=true */のようなファイル内の特定のものを探し、fopen/freadを使って最初の行だけを読むべきです。それがなければ、ロードしないでください。

+0

このチェックはそれほど重要ではありません –

+1

true ...しかし、空であればファイルを読み込むのは大したことではありません。ちょうど 'あなたがニッケルと空のファイルをロードするようなものを一杯にするならば、これも「重要」と数えてもいいでしょう –

1

他の回答で述べたように、ローカルファイルのへの道はfilesizeです。 HTTPを含む多くのストリームラッパーはではないstat()のサポートを持っているので、file_get_contentsは動作しますが、filesizeは失敗します。

4

filesizeを使用する場合は、誰でも注意してください。パフォーマンスが向上するように結果がキャッシュされるためです。だから、あなたがより良い精度を必要とする場合、のようなものを使用することをお勧めします。

<? 
clearstatcache(); 
if(filesize($path_to_your_file)) { 
    // your file is not empty 
} 

More info here

+1

マニュアルは明示的に 'filesize'パラメータが文字列。 'fopen'はリソースを返します。 – Nicero

+0

@Nicero、ありがとうございます。私はコードを編集しました。 – userlond