2011-01-31 2 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() использует stat() для detirmine размера файла. Используйте filesize(), он должен потреблять меньше дискового ввода-вывода.

+6

... и потребляют гораздо меньше памяти – symcbean

+1

Просто хочу отметить, что если файл меняется clearstatcache вызова() перед вызов filesize() или вы получите кешированные результаты. Это случилось со мной. – Firze

+0

Это сработало для меня. Он возвращает 0, если файл пуст. –

8

Использование filesize(), очевидно, лучше. Он использует stat(), который не должен открывать файл вообще.

file_get_contents() читает весь файл .. представьте, что произойдет, если у вас есть файл размером 10 ГБ.

+4

Представьте, сколько времени займет ваш сайт для загрузки с файлом CSS размером 10 ГБ: P – alex

+1

Я полагаю, что после дальнейших размышлений, возможно, меньше вреда просто загружается пустой css, чем проблема с тестированием, если его пустая, чтобы не загружать ее. –

+0

Для небольших файлов (не прочитавших часть CSS) это не имеет большого значения. filesize() все еще быстрее и намного лучше - зачем вы хотите читать содержимое файла с жесткого диска, если inode (или даже кеш файловой системы или внутренний кэш-память PHP) содержит всю необходимую информацию. – ThiefMaster

4

filesize() будет более эффективным, однако это может ввести в заблуждение. Если бы у кого-то были просто комментарии или даже просто пробелы ... это сделало бы размер файла больше. ИМО вам следует искать что-то конкретное в файле, например /* enabled=true */ в первой строке, а затем использовать fopen/fread, чтобы просто прочитать первую строку. Если его там нет, не загружайте его.

+0

ничего плохого, однако, в ложном результате.эта проверка не так важна –

+1

true ... но также не имеет большого значения просто загрузить файл, если он пуст. Просто скажи ... если ты собираешься никей и купите что-то вроде загрузки пустого файла, вы также можете считать это «важным» –

1

Как упоминалось в других ответах, filesize - это путь для локальных файлов. Многие потоковые обертки, с другой стороны, включая HTTP, do не поддерживают stat(), поэтому filesize не удастся, тогда как file_get_contents будет работать.

4

Все должны быть осторожны при использовании filesize, потому что его результаты кэшируются для лучшей производительности. Так что, если вам нужно больше точности, рекомендуется использовать что-то вроде:

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

More info here

+1

Это не сработает, потому что в руководстве явно указано, что параметр 'filesize' должен быть строка. 'fopen' возвращает ресурс. – Nicero

+0

@ Никеро, спасибо, ты прав. Я редактировал код. – userlond

Смежные вопросы